$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);
感谢您的任何意见。
_____ 更新 ____________
感谢反馈,但我们似乎错过了重点。无论这是否是良好的编程实践,我都想知道为什么性能差异(虽然微小但一致)不在我预期的偏差范围内。
将true传递给microtime似乎并不重要,因为两个样本都使用相同的方法进行测量,具有相同的开销和相同的不准确性。
多次运行测试,如“平均”所暗示的那样。
仅出于说明目的,请考虑使用microtime(true)显示相同模式的以下小样本,与使用microtime()相同:
我知道这只是一个小样本,但模式非常清晰:
继续 0.00037288665771484 0.00048208236694336 0.00046110153198242 0.00039386749267578 0.0003662109375
中断 0.00033903121948242 0.00035715103149414 0.00033307075500488 0.00034403800964355 0.00032901763916016
感谢查看,并感谢任何进一步的反馈。
______ 更新 进一步研究 ____________
有趣的是,如果从代码中删除echo语句,则continue的性能更快,如果echo语句存在,则break更快。
请考虑以下代码示例,并考虑结果是否取决于是否删除了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;
}
存在Echo语句:
Continue平均值0.00014134283065796 Break平均值0.00012669243812561
不存在Echo语句:
Continue平均值0.00011746988296509 Break平均值0.00013022310733795
需要注意的是,从break和flag测试中删除echo语句还会删除($flag === true)检查,因此负载应该会减少,但在这种情况下,continue仍然获胜。因此,在纯粹的continue n与break + flag场景中,continue n似乎是更快的结构。但是,添加相同数量的相同echo语句后,continue n的性能会下降。
对我来说,这是有逻辑的,continue n应该更快,但我希望看到存在echo语句时的相同结果。
这显然是生成的操作码中的差异,以及echo语句的位置(内部循环与外部循环),是否有人知道一种查看生成的操作码的方法?我想理解内部发生了什么。
谢谢:)
microtime(TRUE)
来获取一个适合比较的浮点数。 - mariocontinue
和break
。考虑使用while
代替。不要在for
循环的测试表达式中使用函数。 - KingCrunch