PHP微时间奇怪的行为


PHP microtime strange behavior

我查看了一些函数的执行时间,但我发现微时间在一个microtime() 中出错了

实施№1总是第一次执行的microtime()总是比第二次执行的多,当我测试一个函数时,发现一种情况比另一种情况快,但在位置替换后(第二个函数到第一个位置),它无论如何都会变慢,即使它快了3倍。。。

function dotimes($times,$eval,$data=false) {for(;--$times;) eval($eval);}

$start = microtime(true);
dotimes(1000,'$i = $i?$times/2:1;');
printf(": executed : %f'n",microtime(true)-$start);
$start = microtime(true);
dotimes(1000,'$i = $i?$times/2:1;');
printf(": executed : %f'n",microtime(true)-$start);
// 1st case is always slower...

实施№2iv有时在microtime()之前作为静态数据存储,但在这种情况下,执行时间总是第二次比第一次慢(请参阅实现№1

function get_execution_time()
{
    static $microtime_start = null;
        return $microtime_start === null ? $microtime_start = microtime(true) : microtime(true) - $microtime_start;
}

function dotimes($times,$eval,$data=false) {for(;--$times;) eval($eval);}
get_execution_time();
dotimes(1000,'$i = $i?$times/2:1;');
printf(": executed : %f'n<br>",get_execution_time());
get_execution_time();
dotimes(1000,'$i = $i?$times/2:1;');
printf(": executed : %f'n<br>",get_execution_time());
//now 2nd case is faster..
  • 有人能告诉我发生了什么事吗?为什么这些微时间在一种情况下第一次总是较慢,而通过静态存储第二次执行较慢,为什么

ps如果有人需要小mt功能,这里是我的固定和正确工作

function get_mt() {static $mt; return $mt ? microtime(true)-$mt.$mt=null : $mt=microtime(true);}

附:

function get_mt() {static $mt; return $mt?microtime(true)-$mt:$mt=microtime(true);}
function dotimes($times,$eval,$data=false) {for(;--$times;) eval($eval);}
$start = microtime(true);
get_mt();
dotimes(10000,'$i = $i?$times/2:1;');
printf(":clean executed : %f'n<br>",microtime(true)-$start);
printf(":static executed : %f'n<br>",get_mt());
$start = microtime(true);
get_mt();
dotimes(10000,'$i = $i?$times/2:1;');
printf(":clean executed : %f'n<br>",microtime(true)-$start);
printf(":static executed : %f'n<br>",get_mt());

到目前为止,我看到了该实现№1是正确的。不知道你在第二次实现中尝试了什么。

这里的建议是——永远不要在同一个脚本中测试两个案例。将它们分别运行几次,然后找到平均时间。PHP在需要的时候分配内存,这是一个缓慢的操作。第二种情况可能会重用已经分配的内存并跳过此操作,从而得到错误的结果。

static使该函数中的一个变量成为半全局的函数名。

我想说,延迟是因为需要检查静态数组中静态变量的前一个值。

额外工作量=延迟