基准代码在foreach循环的内部和外部之间不同

时间:2016-10-31 11:04:12

标签: php codeigniter foreach benchmarking

我有一段看起来像这样的代码:

$this->benchmark->mark('start1');
$timer = 0;
foreach($x as $y)
{
    $this->benchmark->mark('start2');
    // Some code here
    $this->benchmark->mark('end2');
    $timer = $timer + $this->benchmark->elapsed_time('start2','end2');
}
var_dump('Timer = '.$timer);
$this->benchmark->mark('end1);
var_dump('Total = '.$this->benchmark->elapsed_time('start1','end1') );

这给了我类似的东西

Timer = 0.43466
Total = 45.34421

这怎么可能?它们应该完全相同。

1 个答案:

答案 0 :(得分:0)

我认为这个问题有点像量子力学中光子的波粒二象性。或者,这是PHP函数benchmark;

中的错误

在试图解决这个问题时,我首先怀疑microtime()是问题,因为它返回一个字符串。但这根本没有涉及。

为了确保这不是问题的一部分,我将benchmark从等式中取出并直接使用microtime()class Profiling extends CI_Controller { public function index() { $param = 3000000; $start_1 = microtime(TRUE); $timer = $this->long_exec_time($param); $end_1 = microtime(TRUE); echo "Timer"; var_dump($timer); $total = $end_1 - $start_1; echo "Total"; var_dump($total); } public function long_exec_time($param) { $timer = 0; for($i = 1; $i < $param; $i++) { $start_2 = microtime(TRUE); sqrt($i); $timer += (microtime(TRUE) - $start_2); } return $timer; } } 课程大多只使用long_exec_time,但我想确定。

这是我的第一次迭代

public function long_exec_time($param)
{
    $timer = 0;
    $start_2 = microtime(TRUE);
    for($i = 1; $i < $param; $i++)
    {
        sqrt($i);
    }
    $timer += (microtime(TRUE) - $start_2);
    return $timer;
}

哪个输出

  

定时器

     

浮动3.8147616386414

     

总计

     

浮动6.5267660617828

看起来像你的问题。它确实需要6秒多的时间才能执行。

但是如果函数microtime(TRUE)被定义为这样

microtime

输出

  

定时器

     

float 2.3692939281464

     

总计

     

浮动2.3693020343781

是的,那是实际的执行时间。

这肯定指向重复调用$this->benchmark->mark导致更长的总执行时间。

但为什么这两个总数不匹配对我来说是一个谜。从逻辑上讲,它们的价值应该更接近。我唯一想到的是foreach有自己的问题。我发现某些环境中函数内存泄漏的报告。但我不确定这会如何导致古怪的差异 - 如果它有所贡献。

所有这一切,我很确定如果您在{{1}}循环中移除对{{1}}的调用,事情会更快。