首頁  >  文章  >  後端開發  >  php讀寫檔案與讀寫資料庫的效率比較分析

php讀寫檔案與讀寫資料庫的效率比較分析

WBOY
WBOY原創
2016-07-25 08:57:34969瀏覽
  1. set_time_limit(0);
  2. function fnGet($filename)
  3. {
  4. $content = fileget_contents(filename)return $content;
  5. }
  6. function fnGetContent($filename)
  7. {
  8. $content = fnGet($filename);
  9. return $content;
  10. }
  11. $times=100000;
  12. echo '資料庫查詢結果:
    ';
  13. //----------------------- ------------- -- ----------
  14. $begin=fnGetMicroTime();
  15. for($i=0;$i{
  16. $res =$ dbcon->mydb_query("從部落格選擇log_Content WHERE log_ID='1'");
  17. $row=$dbcon->mydb_fetch_row($res) ;
  18. $content=$row[0] ;
  19. }
  20. echo 'fetch_row '.$times.' 次時間:'.(fnGetMicroTime()-$begin).'
    ';
  21. //--------- ---- --------------------
  22. $begin=fnGetMicroTime();
  23. for($i=0;$i{
  24. $res=$dbcon->mydb_query("從部落格選擇log_Content WHERE log_ID='1'");
  25. $row=$dbcon->mydb_fetch_array($res) ;
  26. $row=$dbcon->mydb_fetch_array($res) ;
  27. $row=$ content=$row['log_Content'];
  28. }
  29. echo 'fetch_array '.$times.' 次時間:'.(fnGetMicroTime()-$begin).'
    ';
  30. //--------- ---- --------------------
  31. $begin=fnGetMicroTime();
  32. for($i=0;$i{
  33. $res=$dbcon->mydb_query("從部落格選擇log_Content WHERE log_ID='1'");
  34. $row=$dbcon->mydb_fetch_object($res) ;
  35. $ content=$row->log_Content;
  36. }
  37. echo 'fetch_object '.$times.' 次時間:'.(fnGetMicroTime()-$begin).'
    ';
  38. //--------- ---- --------------------
  39. $dbcon->mydb_free_results();
  40. $dbcon->mydb_disconnect();
  41. fnWriteCache('test. txt',$content);
  42. echo '直接讀取檔案測試結果:
    ';
  43. //------------- -------- ------------
  44. $begin=fnGetMicroTime();
  45. for($i=0;$i{
  46. $content = fnGetContent('test.txt');
  47. }
  48. echo 'file_get_contents直接讀取'.$times.'次時間:'.(fnGetMicroTime ()-$begin).'秒
    ';
  49. //------------------------ ----------
  50. $begin=fnGetMicroTime();
  51. for($i=0;$i{
  52. $fname = ' test.txt';
  53. if(file_exists ($fname))
  54. {
  55. $fp=fopen($fname,"r");//flock($fp,LOCK_EX);
  56. $ file_data=fread($fp, filesize($fname ) ));//倒回($fp);
  57. fclose($fp);
  58. }
  59. $content = fnGetContent('test.txt');
  60. }
echo 'fopen直接讀取'.$times.'次時間:'.(fnGetMicroTime()-$begin).'
';
複製程式碼

4K大小資料的查詢結果: fetch_row 100000 次時間:16.737720012665秒 fetch_array 100000 次時間:16.661195993423秒 fetch_object 100000 次時間:16.775065898895秒

直接讀取文件測試結果: file_get_contents直接讀取100000次時間:5.4631857872009秒 fopen直接讀100000次時間:11.463611125946秒

整形ID查詢結果: fetch_row 100000 次時間:12.812072038651秒 fetch_array 100000 次時間:12.667390108109秒 fetch_object 100000 次時間:12.988099098206秒

直接讀取文件測試結果: file_get_contents直接讀取100000次時間:5.6616430282593秒 fopen直接讀100000次時間:11.542816877365秒

檢定結論: 1.直接讀取文件相比資料庫查詢效率更勝一籌,而且文中還沒算上連接和斷開的時間。

2、一次讀取的內容越大,直接讀文件的優勢會越明顯(讀文件時間都是小幅增長,這跟文件存儲的連續性和簇大小等有關係),這個結果恰恰跟天緣預料的相反,說明MYSQL對更大檔案讀取可能又附加了某些操作(兩次時間成長了近30%),如果只是單純的賦值轉換應該是差異偏小才對。

3、寫文件和INSERT幾乎不用測試就可以推測出,資料庫效率只會更差。

4、很小的設定檔如果不需要使用到資料庫特性,更加適合放到獨立文件裡訪問,無需單獨創建數據表或記錄,很大的文件比如圖片、音樂等採用文件存儲更為方便,只把路徑或縮圖等索引資訊放到資料庫裡更合理一些。

5、PHP上如果只是讀取文件,file_get_contents比fopen、fclose更有效率,不包括判斷存在這個函數時間會少3秒左右。

6、fetch_row和fetch_object應該是從fetch_array轉換而來的,我沒看過PHP的源碼,單從執行上就可以說明fetch_array效率更高,這跟網上的說法似乎相反。 假定在程式效率和關鍵過程相當且不計入快取等措施的條件下,讀寫任何類型的資料都沒有直接操作檔案來的快,不論MSYQL過程如何,最後都要到磁碟上去讀這個“檔案” (記錄儲存區等效),所以當然這一切的前提是只讀內容,無關任何排序或尋找操作。



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn