В компьютерном программировании оптимизация с управлением профилем ( PGO , иногда произносится как пого [1] ), также известная как оптимизация с управлением профилем ( PDF ) [2] или оптимизация с управлением обратной связью ( FDO ) [3] , представляет собой метод оптимизации компилятора , использующий предварительный анализ программных артефактов или поведения (« профилирование ») для улучшения ожидаемой производительности выполнения программы.
Методы оптимизации, основанные на статическом анализе исходного кода программы, рассматривают улучшения производительности кода без фактического выполнения программы. Динамический анализ программы не выполняется. Например, вывод или наложение формальных ограничений на количество итераций, которые цикл , вероятно, выполнит, принципиально полезны при рассмотрении вопроса о том, следует ли его разворачивать или нет, но такие факты обычно опираются на сложные факторы времени выполнения, которые трудно окончательно установить. Обычно статический анализ будет иметь неполную информацию и сможет только приблизительно оценить возможные условия времени выполнения.
Первый высокоуровневый компилятор, представленный как Fortran Automatic Coding System в 1957 году, разбил код на блоки и разработал таблицу частоты выполнения каждого блока посредством имитационного выполнения кода в стиле Монте-Карло , в котором результат условных передач (как IF
операторов via -type) определяется генератором случайных чисел, соответствующим образом взвешенным любыми FREQUENCY
операторами, предоставленными программистом. [4]
Вместо информации о частоте, предоставленной программистом, оптимизация на основе профиля использует результаты профилирования тестовых запусков инструментированной программы для оптимизации окончательного сгенерированного кода . [5] [6] [7] Компилятор получает доступ к данным профиля из выборочного запуска программы по репрезентативному набору входных данных. Результаты показывают, какие области программы выполняются чаще, а какие — реже. Все оптимизации выигрывают от обратной связи на основе профиля, поскольку они меньше полагаются на эвристику при принятии решений о компиляции. Однако предостережение заключается в том, что выборка данных, подаваемая в программу на этапе профилирования, должна быть статистически репрезентативной для типичных сценариев использования; в противном случае обратная связь на основе профиля может нанести вред общей производительности окончательной сборки вместо ее улучшения.
Компиляция Just-in-time может использовать информацию времени выполнения для динамической перекомпиляции частей исполняемого кода для генерации более эффективного собственного кода. Если динамический профиль изменяется во время выполнения, он может деоптимизировать предыдущий собственный код и сгенерировать новый код, оптимизированный с помощью информации из нового профиля.
Существует поддержка сборки Firefox с использованием PGO. [8] Несмотря на эффективность PGO, он не получил широкого распространения в программных проектах из-за своей утомительной модели двойной компиляции. [9] Также возможно выполнять PGO без инструментирования, собирая профиль с помощью счетчиков производительности оборудования . [9] Этот подход на основе выборки имеет гораздо меньшие накладные расходы и не требует специальной компиляции.
Виртуальная машина Java HotSpot (JVM) использует профильную оптимизацию для динамической генерации собственного кода. Как следствие, двоичный файл программного обеспечения оптимизируется для фактической нагрузки, которую он получает. Если нагрузка изменяется, адаптивная оптимизация может динамически перекомпилировать работающее программное обеспечение, чтобы оптимизировать его для новой нагрузки. Это означает, что все программное обеспечение, выполняемое на HotSpot JVM, эффективно использует профильную оптимизацию. [10]
PGO был принят в версии Google Chrome для Microsoft Windows . PGO был включен в 64-разрядной версии Chrome, начиная с версии 53, и версии 54 для 32-разрядной версии. [11]
Google опубликовала статью [12], в которой описывается инструмент, позволяющий использовать производственные профили для управления сборками, что приводит к повышению производительности до 10%.
Примеры компиляторов, реализующих PGO:
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )