2012-07-28 53 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