php里面写for循环语句吗,for循环-PHP中while(true)和for(;;)之间有什么区别?

好的,首先让我这样说:使用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,它们将是相同的...

警告

这是一个完整而完全的微优化,可作为决策的基础。 使用可读的。 不要基于性能使用一个。 区别在那里,但微不足道。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值