请考虑以下代码:

$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);

谢谢你的意见。
___更新_______
谢谢你的反馈,但我们似乎没有抓住要点。不管这是否是一个好的编程实践,我试图理解为什么性能差异(虽然很小但一致)不在我预期的偏差范围内。
由于两个样本都是用相同的方法测量的,而且开销相同,误差也相同,因此真到微时间的传递似乎微不足道。
测试了不止一次,正如平均数这个词所暗示的那样。
为了便于说明,请考虑以下使用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语句:
继续平均0.00014134283065796
断裂平均值0.00012669243812561
echo语句不存在:
继续平均0.00011746988296509
断裂平均值0.00013022310733795
请注意,通过从break和flag测试中删除echo语句,我们还删除了($flag===true)检查,因此负载应该会减少,但在这种情况下仍然会继续。W
所以在纯continue n与break+标记的场景中,continue n似乎是更快的contstruct。但是添加相等数量的相同echo语句和continue n性能标志。
这在逻辑上对我来说是合理的,continue n应该更快,但我本希望在echo语句中看到相同的结果。
这显然是生成的操作码之间的区别,echo语句的位置(内环与外环)是否有人知道如何查看生成的操作码?我想这是我需要的最后通牒,因为我正试图了解内部正在发生的事情。
谢谢)

最佳答案

是的,第一个比较快。因为它只是跳到第二集,然后打印出$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上运行快:)

10-05 20:34
查看更多