1

我正在查看一些函数的执行时间,但我发现 microtime 出错了,在一个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...

实施№2 iv有时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());
4

2 回答 2

2

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

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

于 2012-07-28T15:13:11.573 回答
0

static 使该函数中的变量半全局相对于函数名称。

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

额外的工作==延迟

于 2012-07-28T14:50:08.713 回答