2014-07-05 105 views
2

我正在做一些PHP文件讀取功能的基準測試,僅僅是爲了我的整體知識。 所以我測試了三種不同的方式來讀取我認爲速度非常快的文件的全部內容。PHP性能file_get_contents()vs readfile()和cat

  • file_get_contents()函數衆所周知的用於其非常高的性能
  • 的ReadFile()稱爲是一個很好的替代的file_get_contents(),當涉及到直接輸出所述數據到stdout
  • EXEC(」貓文件名')一個非常方便和快速的UNIX命令

因此,這裏是我的基準測試代碼,請注意,我啓用了PHP緩存系統爲readfile()避免直接輸出將完全僞造的結果。

<?php 
/* Using a quick PNG file to benchmark with a big file */ 

/* file_get_contents() benchmark */ 
$start = microtime(true); 
$foo = file_get_contents("bla.png"); 
$end = microtime(true) - $start; 
echo "file_get_contents() time: " . $end . "s\n"; 

/* readfile() benchmark */ 
ob_start(); 
$start = microtime(true); 
readfile('bla.png'); 
$end = microtime(true) - $start; 
ob_end_clean(); 
echo "readfile() time: " . $end . "s\n"; 

/* exec('cat') benchmark */ 
$start = microtime(true); 
$bar = exec('cat bla.png'); 
$end = microtime(true) - $start; 
echo "exec('cat filename') time: " . $end . "s\n"; 
?> 

我已經跑這段代碼幾次,確認顯示的結果,每次我有同樣的順序。這裏是其中的一個示例:正如你所看到file_get_contents()

$ php test.php 
file_get_contents() time: 0.0006861686706543s 
readfile() time: 0.00085091590881348s 
exec('cat filename') time: 0.0048539638519287s 

出現在前然後到達readfile()最後cat

至於cat即使它是一個UNIX命令(這麼快,一切:))我明白,調用一個單獨的二進制可能會導致相對較高的結果。 但我有一些難以理解的事情是,爲什麼file_get_contents()readfile()更快?這大約是慢1.3倍,畢竟是

兩個功能是內置的,因此相當不錯了優化,因爲我啓用了高速緩存,ReadFile的()不是「試圖」將數據輸出到stdout但就像file_get_contents()函數就會把裏面的數據RAM。

我要尋找一個技術低層次的解釋這裏瞭解file_get_contents()readfile()的優劣,除了一個事實,就是被設計成直接寫入到標準輸出,而另一個則在RAM內的內存分配。

在此先感謝。

回答

2

file_get_contents只從內存中的文件加載數據,而readfilecat也在屏幕上輸出數據,所以他們只是執行更多的操作。

如果你想比較file_get_contents別人,添加echo

而且,你是不是釋放分配給$ foo的內存了。如果您將file_get_contents作爲最後一次測試移動,您可能會得到不同的結果。

此外,您正在使用輸出緩衝,這也會導致一些差異 - 只是嘗試在輸出緩衝代碼中添加其餘功能以消除任何差異。

當比較不同的功能時,其餘的代碼應該是相同的,否則你會對各種影響開放。

+0

我改變了file_get_contents()和readfile()的順序,我仍然得到相同的結果。但我想你的第一個假設是對的,因爲這是我可能理解的唯一解釋。 –

+1

@ValentinMercier我將測試修改爲: 'ob_start(); $ start = microtime(true); echo file_get_contents(「$ file」); $ end = microtime(true) - $ start; ob_end_clean();' 和file_get_contents變得像讀取文件一樣緩慢 –

+1

哇,這是非常有趣的。這解釋了很多 –