Уровни оптимизации OPKache PHP - что это такое?

Существует директива opcache.optimization_level php.ini. Это битмаска по умолчанию 0xffffffff - поэтому по умолчанию OPcache выполняет все оптимизации.

Какую оптимизацию делает OPcache? Что происходит с байт-кодом?

Последующий вопрос: существует ли код кода, который OPcache может очень хорошо оптимизировать? Например, HHVM может пропускать выполнение файлов, содержащих только объявления класса/функции, и просто заполняет таблицы классов/функций.

Ответ 1

Биты opcache.optimization_level соответствуют:

  • бит 0 - проход 1:
    • CSE - устранение подвыражений констант
    • Последовательности оптимизации ADD_CHAR/ADD_STRING
    • конвертировать CAST (IS_BOOL, x) в BOOL (x)
    • конвертировать INTI_FCALL_BY_NAME + DO_FCALL_BY_NAME в DO_FCALL
  • бит 1 - проход 2:
    • Преобразование константных операндов в ожидаемые типы
    • Преобразование условного JMP с постоянными операндами
    • Оптимизировать статические BRK и CONT
  • бит 2 - проход 3:
    • Преобразование $a = $a + expr в $a + = expr
    • Преобразование $a ++ в ++ $a
    • Оптимизировать серию JMP s
  • бит 3 - проход 4:
  • бит 4 - проход 5:
    • оптимизация блоков (самый дорогой шаг оптимизации, который выполняет множество различных шаблонов оптимизации на основе CFG - диаграммы потока управления)
  • бит 8 - проход 9:
    • register allocation (позволяет повторно использовать временные переменные)
  • бит 9 - проход 10:
    • удалить NOP

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

Информация из https://github.com/zendtech/ZendOptimizerPlus/blob/master/Optimizer/zend_optimizer.c и https://gist.github.com/ck-on/4959032?ocp.php