PHP microtime奇怪的行为

时间:2012-07-28 14:44:51

标签: php timer eval xmlreader microtime

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

实施№1总是第一次总是得到更多然后第二次microtime()执行,当我测试一个函数并看到一个案例比另一个案件更快,但在替换之后(< em>第二个功能到第一个地方),无论如何它变得越来越慢,即使速度提高了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...

实施№2 iv有时在microtime()之前作为静态数据存储,但在这种情况下执行的时间总是第二次比第一次慢( oposite to implementation №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..
  • 有人可以告诉我正在发生什么?为什么一个案例中的这些微量元素1总是较慢,而静态存储第二个执行速度慢,为什么

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());

2 个答案:

答案 0 :(得分:2)

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

这里的建议 - 永远不要在同一个脚本中测试两个案例。单独运行几次,然后找到平均时间。 PHP在需要时分配内存,这是一个缓慢的操作。第二种情况可能会重复使用已分配的内存并跳过此操作,结果会出错。

答案 1 :(得分:0)

static使一个变量半全局在该函数中保留为函数名。

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

额外工作==延迟