PGO: как компилятор перекраивает бинарник под реальные нагрузки
PGO or not PGO this is the dilemma. Step 2
Вторая часть цикла Percona о Profile-Guided Optimization (PGO). Разбирается двухпроходная сборка: сначала инструментирование (-fprofile-generate) и сбор счётчиков выполнения, затем перекомпиляция с учётом профиля. Подробно описаны ключевые трансформации: инлайнинг, переупорядочивание ветвлений (горячий путь — fall-through, холодный — вынос), разделение функций на горячие и холодные части, перестановка функций в бинарнике, продвижение косвенных вызовов и другие. Главная мысль: PGO оптимизирует не под конкретные данные, а под форму потока управления.
PGO — это не «сделать обученную нагрузку быстрой», это «сказать компилятору, какой код горячий, а какой холодный, и позволить ему перекроить весь бинарник соответствующим образом».