968просмотров
35.7%от подписчиков
27 февраля 2026 г.
statsScore: 1.1K
🚀 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