while(true)和for(;;)在PHP中有什么区别?
除了语法和可读性之外, while(true)
和for(;;)
之间的PHP有什么区别吗?
编辑:我不会认为这是重复的 – 我想知道特定于PHP的答案。 就引擎而言,有没有真正的区别? 他们编译到相同的东西? 他们有相同的performance吗?
编辑2:我也不会考虑相关的性能和相关的OpCodes是基于意见。 在可读性方面有意见的范围,但这显然不是问题。
好吧,首先,让我这么说: 使用while(true)
,因为它提供了最多的语义 。 你需要parsingfor (;;)
因为这不是你经常看到的东西。
这样说吧,我们来分析一下:
操作码
代码
while(true) { break; } echo "hi!";
编译到操作码:
0: JMPZ(true, 3) 1: BRK(1, 3) 2: JMP(0) 3: ECHO("hi!")
所以基本上,它检查是否为“真”,如果不是,则跳转到回显操作码的第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(条件,位置)
如果条件为false
则此操作码跳转。 如果这是true
,它只会推进一个操作码。
JMPZNZ(condition,pos1,pos2)
如果条件为真,则此操作码跳转到pos1
如果条件为false,则pos2
。
JMP(位置)
这个操作码总是跳转到指定位置的操作码。
BRK(级别,职位)
这打破了position
上的操作码的level
级别
ECHO(串)
输出string
他们是一样的吗?
那么,看看操作码,很明显,它们是不一样的。 他们是==
,但不是===
。 while(true)
循环执行条件跳转,然后是代码,然后是无条件跳转。 for(;;)
循环执行条件跳转,然后是代码,然后是无条件跳转,然后是另一个无条件跳转。 所以它做了一个额外的跳跃。
Opcache
在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,他们将是相同的…
警告
这是一个完整的,完全的微观优化基础的决定。 使用可读的。 根据性能不要使用一个。 不同的是,这是微不足道的。