我正在做一些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內的內存分配。
在此先感謝。
我改變了file_get_contents()和readfile()的順序,我仍然得到相同的結果。但我想你的第一個假設是對的,因爲這是我可能理解的唯一解釋。 –
@ValentinMercier我將測試修改爲: 'ob_start(); $ start = microtime(true); echo file_get_contents(「$ file」); $ end = microtime(true) - $ start; ob_end_clean();' 和file_get_contents變得像讀取文件一樣緩慢 –
哇,這是非常有趣的。這解釋了很多 –