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,他们将是相同的…

警告

这是一个完整的,完全的微观优化基础的决定。 使用可读的。 根据性能不要使用一个。 不同的是,这是微不足道的。