Материал проходит вычитку — возможны неточности.
Урок 18 из 118

-gcflags=-m и чего не делать

Миша вооружился флагом компилятора и разобрал вывод по каждому файлу сервиса. Аня остановила его на ревью: это окно для диагностики, а не руководство к действию — код, написанный «под анализатор», ломается при следующем обновлении.

Главная мысль

-gcflags=-m печатает решения escape analysis; читать его полезно для диагностики, но писать код «под escape analysis» — нельзя: это оптимизация, а не гарантия.

Как увидеть решения

$ go build -gcflags=-m ./...

Флаг печатает решения escape analysis вместе с решениями об инлайнинге. Ключевые сообщения:

./main.go:11:10: &record{...} escapes to heap
./main.go:17:5: moved to heap: n
./main.go:29:17: u escapes to heap

escapes to heap — значение ушло в кучу; moved to heap — захваченная замыканием переменная; does not escape — осталось на стеке, и его хочется видеть в горячем коде.

Две оговорки о чтении

Escape analysis выполняется после инлайнинга, поэтому с -gcflags=-m -l (отключить инлайнинг) картина может измениться — это тот же анализ, но в другом контексте. И escapes to heap — решение анализа, а не факт аллокации: указатель, боксующийся в интерфейс, ничего не аллоцирует, хотя сообщение может появиться. Точную цифру покажет бенчмарк с -benchmem. Для деталей есть -gcflags=-m=2 — граф потока: из какой точки значение утекает и куда.

Чего делать не надо

Escape analysis — оптимизация компилятора, а не гарантия языка. Две логически одинаковые программы могут различаться по аллокациям между версиями Go: анализ регулярно улучшают, и код, сбегавший в кучу в одной версии, в следующей может остаться на стеке. Поэтому не пиши код «под escape analysis»: трюки ради does not escape — ломкие, нечитаемые и перестают работать после обновления тулчейна. Нормальная стратегия — идиоматичный код, а -gcflags=-m — диагностика на случай, когда профиль показывает аллокации там, где их не ждали.

Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Сообщение «escapes to heap» — это факт аллокации?

Вопрос 2 из 3

Влияет ли инлайнинг на картину escape analysis?

Вопрос 3 из 3

Стоит ли писать код «под escape analysis» ради does not escape?

Итоги

-gcflags=-m — окно в решения анализа; читать с оговорками (инлайнинг, «решение ≠ аллокация»). Код под escape analysis не пишут — идиоматичный код и профиль вместо трюков.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки