除了语法和可读性之外,在PHP中while(true)
和for(;;)
之间有区别吗?
除了语法和可读性之外,在PHP中while(true)
和for(;;)
之间有区别吗?
首先,让我说一下:使用while(true)
,因为它给出了最语义化的含义。你需要解析for (;;)
,因为它不是经常见到的东西。
有了这个前提,让我们分析一下:
这段代码:
while(true) {
break;
}
echo "hi!";
0: JMPZ(true, 3)
1: BRK(1, 3)
2: JMP(0)
3: ECHO("hi!")
for (;;) {
break;
}
echo "hi!";
编译成:
0: JMPZNZ(true, 2, 4)
1: JMP(0)
2: BRK(1, 4)
3: JMP(1)
4: ECHO("hi!")
因此,我们可以立即看到在 for(;;)
版本中有一个额外的操作码。
如果条件为 false
,则此操作码跳转。如果条件为 true
,则仅推进一个操作码。
如果条件为真,则此操作码跳转到 pos1
,如果条件为假,则跳转到 pos2
。
此操作码始终跳转到指定位置的操作码。
将 level
级别中断到 position
操作码处。
输出字符串。
==
,但不是 ===
。 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!")
while
版本中,JMP(1)
作为第一条指令有什么意义?这不是相当于无操作吗?为什么它没有被优化掉? - bdeshamJMP(2); JMP(0);
也会被优化为 JMP(2);
,但我无法立即确定它是否会进一步优化为 NOP... - ircmaxellwhile(true)
应该是首选。 - Brian Sfor (;;)
”这部分——实际上在C中经常使用它代替while (1)
,因为代码检查工具对for
变体的抱怨较少[需要引证]。 - TC1
while(true)
中看到稍微更快的性能。 - Michael Berkowskiwhile(1)
。 - Al.G.