首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP为什么继续比使用中断慢

问PHP为什么继续比使用中断慢
EN

Stack Overflow用户
提问于 2011-04-02 21:49:37
回答 1查看 800关注 0票数 4

请考虑以下代码:

代码语言:javascript
复制
$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);

考虑到上面的代码有效地使用了连续2来打破内环并跳过任何代码后的内环,为什么当下面的代码看起来执行得更多时,它的执行速度会更快:

代码语言:javascript
复制
 $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语句,则继续执行的速度会更快,回显语句的中断速度也会更快。

请考虑以下代码示例,并考虑结果是否冲突取决于是否删除回显语句:

代码语言:javascript
复制
<?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

请注意,通过从中断和标志测试中删除回显语句,我们还删除了($flag === true)检查,因此负载应该减少,但在本例中继续仍将获胜。W

因此,在纯连续n与中断+标志场景中,继续n似乎是更快的构造。但是添加相同数量的完全相同的echo语句,并添加连续n个性能标志。

这在逻辑上是有道理的,继续n应该更快,但我希望在出现的echo语句中看到同样的情况。

这显然是生成的操作码的不同之处,回声语句的位置(内循环与外循环)是否有人知道如何查看生成的操作码?我认为这是我所需要的,因为我正在努力理解内部正在发生的事情。

谢谢:)

EN

回答 1

Stack Overflow用户

发布于 2011-04-02 22:07:29

是的,第一个更快。这是因为它只是跳出继续2并打印$i。

第二个例子有更多的工作要做。给$flag变量赋值,跳出循环,检查$标志的值,检查$标志的类型(也比较),然后打印出$i。

不管怎样,这有什么用吗?

我的一些比较结果

代码语言:javascript
复制
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%的第一次尝试速度更快)

代码语言:javascript
复制
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%秒更快)

代码语言:javascript
复制
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服务器比在上运行一台要快

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5526129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档