比较PHP中的执行时间

时间:2011-03-24 12:29:00

标签: php comparison execution-time

我想比较不同的PHP代码,知道哪一个会更快地执行。我目前正在使用以下代码:

<?php
    $load_time_1 = 0;
    $load_time_2 = 0;
    $load_time_3 = 0;

    for($x = 1;  $x <= 20000; $x++)
    {
        //code 1
        $start_time = microtime(true);

        $i = 1;
        $i++;

        $load_time_1 += (microtime(true) - $start_time);

        //code 2
        $start_time = microtime(true);

        $i = 1;
        $i++;

        $load_time_2 += (microtime(true) - $start_time);

        //code 3
        $start_time = microtime(true);

        $i = 1;
        $i++;

        $load_time_3 += (microtime(true) - $start_time);
    }

    echo $load_time_1;
    echo '<br />';
    echo $load_time_2;
    echo '<br />';
    echo $load_time_3;
?>


我已多次执行该脚本。

第一个结果是

0.44057559967041
0.43392467498779
0.43600964546204

第二个结果是

0.50447297096252
0.48595094680786
0.49943733215332

第三个结果是

0.5283739566803
0.55247902870178
0.55091571807861


结果看起来没问题,但问题是,每次执行此代码时结果都不同。另外,我在相同的代码和同一台机器上进行了三次比较。

为什么比较时速度会有所不同?有没有办法比较执行时间,看看真正的区别?

4 个答案:

答案 0 :(得分:1)

结果变化的原因是因为还有其他事情在同一时间发生,例如基于Windows或Linux的任务,其他进程,您将永远无法得到确切的结果,您最好在100次迭代中运行代码然后将结果分配给平均时间,并将其用作数字/

另外,创建一个可以为您处理此问题的类是有益的,这样您就可以一直使用它而无需每次都编写代码:

尝试这样的事情(未经测试):

class CodeBench
{
    private $benches = array();

    public function __construct(){}

    public function begin($name)
    {
        if(!isset($this->benches[$name]))
        {
            $this->benches[$name] = array();
        }

        $this->benches[$name]['start'] = array(
            'microtime' => microtime(true)
            /* Other information*/
        );
    }

    public function end($name)
    {
        if(!isset($this->benches[$name]))
        {
            throw new Exception("You must first declare a benchmark for " . $name);
        }

        $this->benches[$name]['end'] = array(
            'microtime' => microtime()
            /* Other information*/
        );
    }

    public function calculate($name)
    {
        if(!isset($this->benches[$name]))
        {
            throw new Exception("You must first declare a benchmark for " . $name);
        }

        if(!isset($this->benches[$name]['end']))
        {
            throw new Exception("You must first call an end call for " . $name);
        }

        return ($this->benches[$name]['end'] - $this->benches[$name]['start']) . 'ms'
    }
}

然后像这样使用:

$CB = new CodeBench();

$CB->start("bench_1");

    //Do work:

$CB->end("bench_1");

$CB->start("bench_2");

    //Do work:

$CB->end("bench_2");

echo "First benchmark had taken: " . $CB->calculate("bench_1");
echo "Second benchmark had taken: " . $CB->calculate("bench_2");

答案 1 :(得分:1)

有一种名为Observational error的东西 只要您的数字不超过它,您的所有测量都只是浪费时间。

进行测量的唯一正确方法称为性能分析,代表测量代码的重要部分,而不是无意义的部分。

答案 2 :(得分:1)

  

为什么会有所不同?   比较速度?

这有两个原因,这两个原因都与PHP和操作系统处理无法控制的事情有关。

首先,计算机处理器只能在任何给定时间执行一定量的操作。操作系统基本上负责处理多任务处理,以将这些可用周期划分到您的应用程序。由于这些周期不是以恒定速率给出的,因此,即使使用相同的PHP命令,也可以预期小的速度变化,因为分配了处理器周期。

其次,时间变化的更大原因是PHP的后台操作。用户完全隐藏了许多内容,例如内存分配,垃圾收集和处理变量的各种名称空间等。这些操作也需要计算机循环,并且可以在脚本期间的意外时间运行。如果在第一次递增期间执行垃圾收集,而不是第二次递增,则会导致第一次操作比第二次操作花费更长时间。有时,由于垃圾收集,执行测试的顺序也会影响执行时间。

速度测试可能有点棘手,因为不相关的因素(如在后台运行的其他应用程序)可能会扭曲您的测试结果。通常在脚本之间很难区分小的速度差异,但是当速度测试运行足够多次时,可以看到真实的结果。例如,如果一个脚本总是比另一个脚本更快,它通常会指出该脚本在处理速度方面更有效。

答案 3 :(得分:-1)

计算速度永远不会100%一成不变。 PHP是服务器端脚本,因此根据服务器可用的计算能力,它可能需要不同的时间。

由于您从每个步骤中减去开始时间,因此预计加载时间3将大于2,这将大于1.