PHP为什么继续比使用break慢

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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()相同的模式.

知道这是一个小样本,但模式很清楚:

继续
0.00037288665771484
0.00048208236694336
0.00046110153198242
0.00039386749267578
0.0003662109375

打破
0.00033903121948242
0.00035715103149414
0.00033307075500488
0.00034403800964355
0.00032901763916016

感谢您的关注,并感谢您提供进一步的反馈.

______更新进一步调查____________

有趣的是,如果从代码删除了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.00012669243812561

回声声明不存在:

继续平均值0.00011746988296509
中断均值0.00013022310733795

请注意,通过从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上运行的更快:)

脚本宝典总结

以上是脚本宝典为你收集整理的PHP为什么继续比使用break慢全部内容,希望文章能够帮你解决PHP为什么继续比使用break慢所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。