在 PHP 中,while(true) 和 for(;;) 有什么区别?操作码操作码定义他们是一样的吗奥普卡什谨慎

PHP在语法和可读性之间和之间有什么区别吗?while(true)for(;;)


答案 1

好吧,首先,让我这样说:使用while(true),因为它给出了最语义的含义。您需要解析,因为它不是您经常看到的东西。for (;;)

话虽如此,让我们分析一下:

操作码

代码

while(true) {
    break;
}
echo "hi!";

编译为操作码:

0: JMPZ(true, 3)
1: BRK(1, 3)
2: JMP(0)
3: ECHO("hi!")

因此,基本上,它会检查“true”,如果不是,则跳转到第4个操作码,即回显操作码)。然后它中断(这实际上只是静态跳转到第4个操作码)。然后循环的结束将是无条件跳回到原始检查

将其与以下方面进行比较:

for (;;) {
    break;
}
echo "hi!";

编译为:

0: JMPZNZ(true, 2, 4)
1: JMP(0)
2: BRK(1, 4)
3: JMP(1)
4: ECHO("hi!")

因此,我们可以立即看到版本中有一个额外的操作码。for(;;)

操作码定义

JMPZ(条件、位置)

如果条件为 ,则此操作码将跳转。如果是 ,它只执行一个操作码。falsetrue

JMPZNZ(condition, pos1, pos2)

如果条件为真,并且条件为假,则此操作码将跳转到。pos1pos2

JMP(位置)

此操作码始终跳转到指定位置的操作码。

BRK(水平、位置)

这会将级别分解为操作码,网址为levelposition

回声(字符串)

输出字符串

他们是一样的吗

好吧,看看操作码,很明显它们并不相同。它们是 ,但不是 。该循环执行条件跳转,后跟代码,后跟无条件跳转。该循环执行条件跳转,后跟代码,后跟无条件跳转,后跟另一个无条件跳转。所以它做了一个额外的跳跃。=====while(true)for(;;)

奥普卡什

在 5.5 中,opcache 的优化器部分将优化静态条件跳转

因此,这意味着代码将优化为:while(true)

0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")

循环变为:for(;;)

0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")

这是因为优化器将查找并优化跳转链。因此,如果您使用的是5.5的内置opcache,它们将是相同的...

谨慎

这是一个完全的微观优化,可以作为决策的基础。使用可读的那个。不要根据性能使用一个。区别是存在的,但它是微不足道的。


答案 2

推荐