概述
好的,首先让我这样说:使用for(;;),因为它具有最大的语义含义。 您需要解析for(;;),因为这不是您经常看到的内容。
这么说,让我们分析一下:
操作码
代码
while(true) {
break;
}
echo "hi!";
编译为操作码:
0: JMPZ(true, 3)
1: BRK(1, 3)
2: JMP(0)
3: ECHO("hi!")
因此,基本上,它会检查“ true”,如果不是,则跳转到第四个操作码(即回显操作码)。 然后它中断了(这实际上只是对第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(条件,位置)
如果条件为for(;;),则该操作码会跳转。如果条件为===,则该操作码只会执行一个操作码而不会执行任何操作。
JMPZNZ(条件,pos1,pos2)
如果条件为真,则此操作码跳至for(;;),如果条件为假,则跳至===。
JMP(位置)
该操作码总是跳到指定位置的操作码。
BRK(级别,位置)
这会将for(;;)的级别打破为===的操作码
回声(字符串)
输出字符串
他们是一样的吗
好了,看一下操作码,很明显它们是不相同的。 它们是for(;;),但不是===。while(true)循环会先执行条件跳转,然后执行代码,再执行无条件跳转。 for(;;)循环执行条件跳转,然后执行代码,然后执行无条件跳转,然后执行另一个无条件跳转。 因此,它会产生额外的跳跃。
操作缓存
在5.5中,opcache的Optimizer部分将优化静态条件跳转。
因此,这意味着for(;;)代码将优化为:
0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")
for(;;)循环变为:
0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")
这是因为优化器将找到并优化跳链。 因此,如果您使用5.5的内置opcache,它们将是相同的...
警告
这是一个完整而完全的微优化,可作为决策的基础。 使用可读的。 不要基于性能使用一个。 区别在那里,但微不足道。
最后
以上就是开心高山为你收集整理的php里面写for循环语句吗,for循环-PHP中while(true)和for(;;)之间有什么区别?的全部内容,希望文章能够帮你解决php里面写for循环语句吗,for循环-PHP中while(true)和for(;;)之间有什么区别?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复