🚀 PGO: Как получить +10% к скорости, не написав ни строчки кода Все мы любим оптимизировать.
Все мы любим оптимизировать. Переписываем мапы, пулим объекты в sync.Pool, боремся с аллокациями. Но что, если я скажу, что в новых версиях Go (начиная с 1.21) можно ускорить приложение на 5-10%, просто подкинув компилятору один файлик?
Profile-Guided Optimization (PGO).
В чем проблема обычного компилятора?
При стандартной сборке компилятор опирается на эвристики. Он смотрит на функцию и гадает: "Наверное, эту функцию вызывают часто, давай-ка я её заинлайню (inline), чтобы сэкономить на вызове". Но компилятор не знает, как ваш код ведет себя в реальном продакшене.
Что меняет PGO?
PGO ломает этот слепой подход. Вы берете профиль нагрузки (CPU profile) с реально работающего продакшена и отдаете его компилятору при сборке следующего релиза.
Компилятор смотрит в профиль: "Ага, вот эта функция processOrder жрет 30% CPU, инлайним её агрессивно! А эта handleError вызывается раз в год - убираем её с горячего пути, чтобы не засорять кэш процессора".
Как это сделать (3 простых шага):
1. Собираем профиль с прода. Идем на боевой (или нагрузочный) сервер, где подключен net/http/pprof, и стягиваем 30-секундный профиль:
curl -o default.pgo http://prod-server:8080/debug/pprof/profile?seconds=30
2. Кладем файл в корень проекта. Просто кидаете файл default.pgo в главную директорию вашего модуля (там же, где лежит go.mod).
3. Собираем как обычно.
go build -o myapp
Всё. Начиная с Go 1.21.2, флаг -pgo=auto включен по умолчанию. Компилятор сам найдет файл default.pgo и оптимизирует бинарник.
☝️ Нюансы для Senior-ов:
• А что если исходный код изменился? PGO в Go спроектирован устойчивым к изменениям (robust). Если вы собрали профиль, а потом немного порефакторили код, компилятор не сойдет с ума. Он применит оптимизации там, где функции совпали, и безопасно проигнорирует несовпадения.
• Где брать профиль для CI/CD?
Настройте автоматический сбор профиля с продакшена (например, раз в неделю) и коммитьте его прямо в репозиторий. Да, бинарный файл в гите - звучит как ересь, но для PGO это официальная рекомендация от команды Go.
#golang #performance #pgo #optimization
👉 @golang_lib