2012-07-28 56 views
1

我一直在寻找的一些功能的执行时间,但我已经发现,microtime中越来越不对劲,在一个microtime()PHP microtime中奇怪的行为

实施№1总是第一时间总是越来越然后第二microtime()执行当我测试的一个功能,看到一个情况下更快那么另一个,但发生之后更换(第2个功能,以第一名),它越来越慢,无论如何,即使是快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实施№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.. 
  • 有人可以告诉我什么是?为什么这些microtimes在一种情况下总是第一个慢,throught静态存储第二执行速度慢了下来,为什么

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

'的eval()'真的吗? – PeeHaa 2012-07-28 14:47:54

+0

只是用于测试,不管我可以放入任何函数,并在第一种情况下 - 总是第二次执行更快。在第二种情况下,总是第二个exec变慢 – Jacob88 2012-07-28 14:48:38

+0

问题是什么?给工作实施例... – meze 2012-07-28 15:01:34

回答

2

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

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

+0

把两个不同的函数用相同的逻辑,但一个应该更快,你会看到,通过静态第二总是慢,在第一个实现第二个总是更快%) – Jacob88 2012-07-28 15:16:46

+0

你永远不会得到那个静态第二会比第一快,与№1相同。我如何才能获得正确的编码方式? – Jacob88 2012-07-28 15:20:04

+0

@ Jacob88但你期望什么? %)你的第一个实现:写下微时间,假设它是100,分配内存1秒(php在内部执行),找到差异:100 - (100 + 1 + 1秒取代码)= 2秒。第二种情况(时间变为102):102-(跳过记忆+ 1)= 1秒。你的第二个实现:写下**记得**时间:100秒。分配内存和评估代码100-(1 + 1)= 2秒。时间没有改变,因为你记住它是静态的:100-(跳过记忆+ 1)= 1 + 2秒,以前的代码= 3秒。这不是你在代码中写的吗? ; P – meze 2012-07-28 15:23:33

0

静态使得该功能retative到内的变量半全球函数名称。

我想说的延迟进去,静态数组需要检查的静态变量的前值的事实。

额外的工作==延迟

+0

好吧,我看到静态的比较慢,但为什么当我打电话第二次此func返回时间总是比以前大??? – Jacob88 2012-07-28 14:53:05

+0

静态的本质是它始终记住静态的以前的值。为什么不试试'静态$ microtime; $ microtime = null',但这有点挫败了静态的使用。每次你打电话时,都会记住以前的值。 – Tschallacka 2012-07-28 15:00:11

+0

好吧忘了静态,看看第一种情况 - 问题是一样的,但反例,为什么以前慢? – Jacob88 2012-07-28 15:04:36