PHP为什么继续比使用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); 鉴于上面的代码有效地使用continue 2来打破内部循环并跳过内部循环后的任何代码,为什么以下代码在看起来做得更多时平均执行得更快: $start = microtime(); for($i = 2; $i < 100; $i++) { $flag = true; for($y = 2; $y <= sqrt($i); $y++) { if($i%$y != 0) { continue; } else { $flag = false; break; } } if($flag === true) echo $i.','; } echo "nFinished in " . (microtime() - $start); 感谢您的任何意见. _____更新____________ 感谢您的反馈,但我们似乎错过了这一点.无论这是一个好的编程实践,我都试图理解为什么性能差异(微小但一致)不在我预期的偏差之内. 真实到微量时间的传递似乎是微不足道的,因为两个样本都是使用相同的方法测量的,具有相同的开销和相同的不准确性. 通过使用单词average来暗示测试了多个运行. 仅举例说明请使用microtime(true)考虑以下小样本,其显示与使用microtime()相同的模式. 我知道这是一个小样本,但模式很清楚: 继续 打破 感谢您的关注,并感谢您提供进一步的反馈. ______更新进一步调查____________ 有趣的是,如果从代码中删除了echo语句,则continue执行得更快,并且echo语句就位更快. 请考虑以下代码示例,并考虑结果是否冲突取决于是否删除了echo语句: <?php $breakStats = array(); $continueStats = array(); ob_start(); for($i = 0; $i < 10000; $i++) { $breakStats[] = doBreakTest(); $continueStats[] = doContinueTest(); } ob_clean(); echo "<br/>Continue Mean " . (array_sum($continueStats) / count($continueStats)); echo "<br/>Break Mean " . (array_sum($breakStats) / count($breakStats)); function doBreakTest() { $start = microtime(true); for($i = 2; $i < 100; $i++) { $flag = true; $root = sqrt($i); for($y = 2; $y <= $root; $y++) { if($i%$y != 0) { continue; } else { $flag = false; break; } } } if($flag === true) echo $i . ''; return microtime(true) - $start; } function doContinueTest() { $start = microtime(true); for($i = 2; $i < 100; $i++) { $root = sqrt($i); for($y = 2; $y <= $root; $y++) { if($i%$y != 0) { continue; } else { echo $i . ''; continue 2; } } } return microtime(true) - $start; } 回声陈述: 继续平均值0.00014134283065796 回声声明不存在: 继续平均值0.00011746988296509 请注意,通过从break和flag测试中删除echo语句,我们还删除了($flag === true)检查,因此负载应该减少,但在这种情况下继续获胜. w ^ 因此,在纯粹的继续n与中断标志场景中,似乎continue n是更快的contstruct.但是添加相同数量的相同echo语句和continue n性能标志. 从逻辑上讲,这对我来说是有意义的,继续n应该更快,但我希望看到与存在的echo语句相同. 这显然是生成的操作码的差异,并且echo语句的位置(内部循环与外部循环)是否有人知道看到生成的操作码的方式?我想这是我最需要的东西,因为我试图了解内部发生的事情. 谢谢 :) 解决方法
是的,第一个有点快.这是因为它只是跳出继续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 使用:PHP 5.3.5 @Windows(1000次尝试; 100%优先更快) 0.0011570 < 0.0012173 0.0005000 > 0.0003333 0.0005110 > 0.0004159 0.0003900 < 0.0014029 0.0003950 > 0.0003119 0.0003120 > 0.0002370 使用:PHP 5.3.3 @ Linux(1000次尝试; 32%优先:68%秒更快) 0.0006700 > 0.0004863 0.0003470 > 0.0002591 0.0005360 > 0.0004027 0.0004720 > 0.0004229 0.0005300 > 0.0004366 使用:PHP 5.2.13 @ Linux(1000次尝试; 9%优先:91%秒更快) 对不起,我没有更多的服务器进行测试:)现在我认为它主要取决于硬件(也可能取决于操作系统). 通常:它证明只有Linux服务器比在Windows上运行的更快:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |