我有一段看起来像这样的代码:
$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
这怎么可能?它们应该完全相同。
答案 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}}的调用,事情会更快。