PHP 解释器是否消除死条件?
Does PHP interpreter eliminate dead conditionals?
在将 PHP 源代码转换为操作码之前,是否有任何优化过程可以消除死条件?
示例:
<?php
if (false) {
echo 'false';
}
echo 'true';
是否转换为echo 'true';
?
如果答案是肯定的,以下哪些情况可以PHP处理?
if(false); //Explicit boolean
$true = true; if($true); //Variable that was assigned a constant boolean
if(ClassName::Constant); //Class constant
if(1>2); //Constant value expression
如有版本具体差异,请大方指教。
只是不,它不会消除任何代码。
是的,无法访问的块将被 opcache 优化器的 "block pass" 部分消除。对于您的特定示例:
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 将不会优化,因为我们目前不对 "real" 变量执行常量传播。目前优化器不使用 SSA 形式,因此我们没有信心执行这种类型的优化。一旦我们有了它,我们就可以使用 SCP / SCCP 通行证来覆盖它。
示例 3 可能会被优化,具体取决于 ClassName
的定义位置。通常,如果它是不可重新绑定范围中的 self
或同一文件中定义的 class,它将被优化。此外,常量的值也必须是静态可评估的常量表达式。
无法访问的代码消除作为 block_pass.c 的一部分实现。
在将 PHP 源代码转换为操作码之前,是否有任何优化过程可以消除死条件?
示例:
<?php
if (false) {
echo 'false';
}
echo 'true';
是否转换为echo 'true';
?
如果答案是肯定的,以下哪些情况可以PHP处理?
if(false); //Explicit boolean
$true = true; if($true); //Variable that was assigned a constant boolean
if(ClassName::Constant); //Class constant
if(1>2); //Constant value expression
如有版本具体差异,请大方指教。
只是不,它不会消除任何代码。
是的,无法访问的块将被 opcache 优化器的 "block pass" 部分消除。对于您的特定示例:
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 将不会优化,因为我们目前不对 "real" 变量执行常量传播。目前优化器不使用 SSA 形式,因此我们没有信心执行这种类型的优化。一旦我们有了它,我们就可以使用 SCP / SCCP 通行证来覆盖它。
示例 3 可能会被优化,具体取决于 ClassName
的定义位置。通常,如果它是不可重新绑定范围中的 self
或同一文件中定义的 class,它将被优化。此外,常量的值也必须是静态可评估的常量表达式。
无法访问的代码消除作为 block_pass.c 的一部分实现。