Влияет ли оптимизация на основе профиля, выполняемая компилятором, на случаи, не охваченные набором данных профилирования?

Этот вопрос не относится к C ++, AFAIK определенные среды выполнения, такие как Java RE, могут выполнять профилированную оптимизацию на лету, меня это тоже интересует.

MSDN описывает PGO следующим образом:

  1. Я настраиваю свою программу и запускаю ее под профилировщиком, затем
  2. компилятор использует данные, собранные профилировщиком, для автоматической реорганизации ветвлений и циклов таким образом, чтобы ветвление количество ошибок в предсказаниях сокращается, и чаще всего исполняемый код размещается компактно, чтобы улучшить его локальность

Теперь очевидно, что результат профилирования будет зависеть от используемого набора данных.

При обычном ручном профилировании и оптимизации я бы нашел некоторые узкие места и исправил эти узкие места и, вероятно, оставил бы весь другой код нетронутым. PGO, кажется, улучшает часто запускаемый код за счет замедления редко запускаемого кода.

А что, если этот замедленный код часто запускается на другом наборе данных, который программа увидит в реальном мире? Ухудшится ли производительность программы по сравнению с программой, скомпилированной без PGO, и насколько серьезной будет эта деградация? Другими словами, действительно ли PGO улучшает производительность моего кода для набора данных профилирования и, возможно, ухудшает его для других наборов данных? Есть ли реальные примеры с реальными данными?

5
задан sharptooth 20 October 2011 в 10:50
поделиться