PHP解释器是否消除了死条件?

时间:2015-11-21 10:58:54

标签: php php-internals

在将PHP源代码转换为操作码之前,是否存在消除死条件的优化过程?

示例:

GetDay()

是否只转换为<?php if (false) { echo 'false'; } echo 'true';

如果答案为是,那么PHP可以处理以下哪种情况?

echo 'true';

如果有特定版本的差异,请慷慨。

2 个答案:

答案 0 :(得分:8)

是的,opcache优化器的“块传递”部分将消除无法访问的块。对于您的特定示例:

if(false);               // 1. Will be optimized
$true = true; if($true); // 2. Will NOT be optimized
if(ClassName::Constant); // 3. Will MAYBE be optimized
if(1>2);                 // 4. Will be optimized

示例2将不会被优化,因为我们目前不对“真实”变量执行常量传播。目前,优化器不使用SSA形式,因此我们没有信心执行此类优化。一旦我们有了这个,我们可以使用SCP / SCCP通行证来解决这个问题。

可以优化示例3,具体取决于ClassName的定义位置。通常,如果它是不可重新绑定范围中的self或同一文件中定义的类,则它将被优化。此外,常量的值也必须是静态可评估的常量表达式。

无法访问的代码消除是block_pass.c的一部分实现的。

答案 1 :(得分:0)

根本不,它不会消除任何代码。