PHP为什么continue n比使用break慢 请考虑以下代码: $start = microtime(); for($i = 2; $i < 100; $i++) { for($y = 2; $y <= sqrt($i); $y++) { if($i%$y != 0) { continue; } else { continue 2; } } echo $i.','; } echo "\nFinished in " . (microtime() - $start); $start=microtime(); 对于($i=2;$i和中断。考虑使用而不是。不要在

PHP为什么continue n比使用break慢 请考虑以下代码: $start = microtime(); for($i = 2; $i < 100; $i++) { for($y = 2; $y <= sqrt($i); $y++) { if($i%$y != 0) { continue; } else { continue 2; } } echo $i.','; } echo "\nFinished in " . (microtime() - $start); $start=microtime(); 对于($i=2;$i和中断。考虑使用而不是。不要在,php,break,continue,Php,Break,Continue,是的,第一个要快一点,因为它在continue 2上跳出并打印$i 第二个例子有更多的工作要做…将值赋给$flag变量,跳出循环,检查$flag的值,检查$flag的类型(也比较),然后打印出$i。这有点慢(简单逻辑) 不管怎样,这有什么目的吗 我的一些结果用于比较 0.0011570 < 0.0012173 0.0011540 < 0.0011754 0.0011820 < 0.0012036 0.0011570 < 0.0011693 0.0011970 < 0

是的,第一个要快一点,因为它在continue 2上跳出并打印$i

第二个例子有更多的工作要做…将值赋给$flag变量,跳出循环,检查$flag的值,检查$flag的类型(也比较),然后打印出$i。这有点慢(简单逻辑)

不管怎样,这有什么目的吗

我的一些结果用于比较

0.0011570 < 0.0012173
0.0011540 < 0.0011754
0.0011820 < 0.0012036
0.0011570 < 0.0011693
0.0011970 < 0.0012790
使用:
PHP5.3.3
@
Linux
(1000次尝试;32%的第一次:68%的第二次更快)

使用:
PHP5.2.13
@
Linux
(尝试1000次;9%的第一次:91%的第二次更快)

对不起,我没有更多的服务器可供测试:)现在我认为这主要取决于硬件(也可能取决于操作系统)


一般情况下:它只证明Linux服务器在Windows上运行的速度比一次快:)

对于我来说,
继续2
版本稍微快一点。但这些不是您通常需要关注的类型。请考虑:

for($y = 2; $y <= sqrt($i); $y++)
与在两种几乎相同的循环样式之间切换相比,这将给您带来更好的改进


如果您觉得更容易理解,则应使用
continue 2
。计算机并不真正关心

要解决有关查看操作码的更新,请参阅:


php-d vld.active=1-d vld.execute=0-f foo.php

输出是否相同?您可以将它们粘贴到这里吗?嗯,要快多少?您应该使用
微时间(TRUE)获得一个比较有用的浮点。单次运行的基准测试是没有意义的。Time10000脚本运行并平均取有用的数据。然后考虑它究竟有多快(如果有的话)。你应该避免在代码循环中过度使用<代码>继续< /代码>和<代码>中断<代码>。考虑使用<代码>而不是<代码>。不要在<<代码>的测试表达式中使用< <代码> -Road。它们在PHP5.3.6中执行的时间差不多相同。这是一个微基准。gh,所以您可能会体验到的任何差异都是由于它在PHP内部的实现方式。也许您是对的,但问题表明,第一个比较慢,而不是更快。@KingCrunch:也许,但我将该代码放入测试中,每次运行第一个都会比较快。@Wh1T3h4Ck5有趣的观察结果,我能问一下什么平台和PHP版本吗锡安?这可能是我的具体硬件,从逻辑上说我支持你,因此有问题,但这些不是我看到的结果。我将尝试另一个框。@Gavin:这是给你的mate(10000次尝试x 3台服务器)。你是对的,第二个更快…更快。完成我上次测试的结果,用微时间改进了一个(真的)。优秀的分数参考代码可读性,并将计算排除在初始化器之外。考虑到这一点,我们并没有真正寻找最快的方法来实现这一点。我们正在讨论面试问题的答案,在讨论中,我建议继续2方法的性能略好于中断版本。我们测试了它,在我的硬件和服务器上,我错了。我只是不明白为什么。@Gavin,如果你不是在讨论最快的方法,那么这个问题就不会被问了。;)我理解好奇,但方法是如此相似,几乎不可能以任何有意义的方式对它进行基准测试,尤其是当它不是的时候甚至接近瓶颈。一个更好的测试(但基本上还是没用)将是一个不包含echo语句的版本。@Gavin,看看是否要比较操作码。不过我认为这不会太有帮助。我认为了解Zend引擎的工作原理以及现代编译器+计算机如何优化和执行预测会更有用。
0.0011570 < 0.0012173
0.0011540 < 0.0011754
0.0011820 < 0.0012036
0.0011570 < 0.0011693
0.0011970 < 0.0012790
0.0011570 < 0.0012173
0.0005000 > 0.0003333
0.0005110 > 0.0004159
0.0003900 < 0.0014029
0.0003950 > 0.0003119
0.0003120 > 0.0002370
0.0006700 > 0.0004863
0.0003470 > 0.0002591
0.0005360 > 0.0004027
0.0004720 > 0.0004229
0.0005300 > 0.0004366
for($y = 2; $y <= sqrt($i); $y++)
$sqrt = sqrt($i);
for($y = 2; $y <= $sqrt; $y++)