-
-
set_time_limit(0);
- function fnGet($filename)
- {
- $content = fileget_contents(filename)return $content;
- }
- function fnGetContent($filename)
- {
- $content = fnGet($filename);
- return $content;
- }
- $times=100000;
- echo '資料庫查詢結果:
';
- //----------------------- ------------- -- ----------
- $begin=fnGetMicroTime();
- for($i=0;$i{
- $res =$ dbcon->mydb_query("從部落格選擇log_Content WHERE log_ID='1'");
- $row=$dbcon->mydb_fetch_row($res) ;
- $content=$row[0] ;
- }
- echo 'fetch_row '.$times.' 次時間:'.(fnGetMicroTime()-$begin).'秒
';
- //--------- ---- --------------------
- $begin=fnGetMicroTime();
- for($i=0;$i{
- $res=$dbcon->mydb_query("從部落格選擇log_Content WHERE log_ID='1'");
- $row=$dbcon->mydb_fetch_array($res) ;
- $row=$dbcon->mydb_fetch_array($res) ;
- $row=$ content=$row['log_Content'];
- }
- echo 'fetch_array '.$times.' 次時間:'.(fnGetMicroTime()-$begin).'秒
';
- //--------- ---- --------------------
- $begin=fnGetMicroTime();
- for($i=0;$i{
- $res=$dbcon->mydb_query("從部落格選擇log_Content WHERE log_ID='1'");
- $row=$dbcon->mydb_fetch_object($res) ;
- $ content=$row->log_Content;
- }
- echo 'fetch_object '.$times.' 次時間:'.(fnGetMicroTime()-$begin).'秒
';
- //--------- ---- --------------------
- $dbcon->mydb_free_results();
- $dbcon->mydb_disconnect();
- fnWriteCache('test. txt',$content);
- echo '直接讀取檔案測試結果:
';
- //------------- -------- ------------
- $begin=fnGetMicroTime();
- for($i=0;$i{
- $content = fnGetContent('test.txt');
- }
- echo 'file_get_contents直接讀取'.$times.'次時間:'.(fnGetMicroTime ()-$begin).'秒
';- //------------------------ ----------
- $begin=fnGetMicroTime();
- for($i=0;$i{
- $fname = ' test.txt';
- if(file_exists ($fname))
- {
- $fp=fopen($fname,"r");//flock($fp,LOCK_EX);
- $ file_data=fread($fp, filesize($fname ) ));//倒回($fp);
- fclose($fp);
- }
- $content = fnGetContent('test.txt');
- }
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過程如何,最後都要到磁碟上去讀這個“檔案” (記錄儲存區等效),所以當然這一切的前提是只讀內容,無關任何排序或尋找操作。
|