PHP OPcache 优化级别 - 它们是什么?

30

有一个opcache.optimization_level php.ini 指令。它是一个位掩码,默认为0xffffffff - 所以默认情况下,OPcache会进行所有的优化。

OPcache会进行哪些优化?它会对字节码进行哪些处理?

后续问题:OPcache是否有一种可以非常好地优化的代码模式?例如,HHVM可以跳过只包含类/函数声明的文件的执行,而只填充类/函数表。


这里提供了一个有些不完整的文档:https://phpinternals.net/categories/opcache - BenMorel
1个回答

69
opcache.optimization_level 中的位对应于以下内容:
  • 第 0 位 - pass 1:
  • 第 1 位 - pass 2:
    • 将常量操作数转换为预期类型
    • 将条件 JMP 与常量操作数一起转换
    • 优化静态 BRKCONT
  • 第 2 位 - pass 3:
    • 将 $a = $a + expr 转换为 $a += expr
    • 将 $a++ 转换为 ++$a
    • 优化一系列 JMP 操作
  • 第 3 位 - pass 4:
  • 第 4 位 - pass 5:
    • 块优化(最昂贵的优化 pass,基于 CFG - 控制流图 执行许多不同的优化模式)
  • 第8位 - 第9次优化:
    • 寄存器分配(允许重新使用临时变量)
  • 第9位 - 第10次优化:
    • 删除NOP指令
  • 我查看了一下它是否处理某些代码模式的效果更好,但我没有找到任何有用的信息。

    信息来自https://github.com/zendtech/ZendOptimizerPlus/blob/master/Optimizer/zend_optimizer.chttps://gist.github.com/ck-on/4959032?ocp.php


    3
    现在有更多的传递了。https://lxr.room11.org/xref/php-src%40master/ext/opcache/Optimizer/zend_optimizer.h - Thomas
    3
    Thomas的链接已经失效。这是在Github仓库中相关文件的链接: https://github.com/php/php-src/blob/master/ext/opcache/Optimizer/zend_optimizer.h - hBGl
    2
    你的链接也挂了。 ;) https://github.com/php/php-src/blob/5b01c4863fe9e4bc2702b2bbf66d292d23001a18/Zend/Optimizer/zend_optimizer.h - Thomas

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接