1

我想比较不同的 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

4 回答 4

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");
于 2011-03-24T12:46:59.947 回答
1

有一种叫做观察错误的东西。
只要您的数字不超过它,您所有的测量都只是浪费时间。

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

于 2011-03-24T12:50:49.210 回答
1

为什么比较时速度会有差异?

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

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

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

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

于 2011-03-24T12:55:32.253 回答
-1

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

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

于 2011-03-24T12:33:01.037 回答