我想比较不同的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
结果看起来没问题,但问题是,每次执行此代码时结果都不同。另外,我在相同的代码和同一台机器上进行了三次比较。
为什么比较时速度会有所不同?有没有办法比较执行时间,看看真正的区别?
答案 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.