[分享]函式運作速度比較:快取篇

WOG設定安裝教學

版主: 涅魂, 簫哥


涅魂
 
文章: 4463
註冊時間: 2004-01-04 11:17 am
來自: Taiwan
性別: 男生

[分享]函式運作速度比較:快取篇

文章涅魂 » 2007-02-16 1:24 am

函式1是WOG內的取值方式,函式2則是函式1再加入快取功能

以下測試以取出wog_df 所有資料為準
函式內容 寫:
代碼: 選擇全部
function func1()
{
   $result=$DB_site->query("SELECT d_id,d_name FROM wog_df");
   while($d=$DB_site->fetch_array($result))
   {
      
   }
}

function func2()
{
   if(!file_exists('./df_cache/df.txt') || filemtime('./df_cache/df.txt')+60*60 < time())
   {
      $fp=fopen('./df_cache/df.txt','w');
      $result=$DB_site->query("SELECT d_id,d_name FROM wog_df");
      while($d=$DB_site->fetch_array($result))
      {
         fputs($fp,$d['d_id'].','.$d['d_name']."\r\n");
      }
      fclose($fp);
   }
   $fp=fopen('./df_cache/df.txt','r');
   while(fscanf($fp,'%d,%s',$d['d_id'],$d['d_name']))
   {
      
   }
   fclose($fp);
}

運作結果 寫:第一次執行(快取未建立)
代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.051589 秒.
[color=brown]Method 1[/color] 運作時間:0.020828 秒.
[color=olive]Method 2[/color] 運作時間:0.030761 秒.
[color=brown]Method 1[/color] 比 [color=olive]Method 2[/color] 快 47.690608795851 %

第二次之後(快取已建立)
代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.025303 秒.
[color=brown]Method 1[/color] 運作時間:0.022251 秒.
[color=olive]Method 2[/color] 運作時間:0.0030519999999999 秒.
[color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快 629.06290956751 %

總運作次數: 1 次.
總運作時間: 0.025568 秒.
[color=brown]Method 1[/color] 運作時間:0.022519 秒.
[color=olive]Method 2[/color] 運作時間:0.0030490000000001 秒.
[color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快 638.57002295833 %

總運作次數: 1 次.
總運作時間: 0.025783 秒.
[color=brown]Method 1[/color] 運作時間:0.022744 秒.
[color=olive]Method 2[/color] 運作時間:0.003039 秒.
[color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快 648.40408028957 %


個人評論 寫:從上方的四篇運作速度可以明顯的得知:

函式1雖然在第一次時的速度明顯比函式2要快上許多(約50%)

然而一旦快取建立的話,則函式2有著飛快似的處理速度(省去讀取資料庫的時間)

而且,只要有次序地建立起快取的話,甚至可以將整份wog_df都複製到快取內

不過有一點要稍微注意,快取主要是省去讀取少更新的資料的時間,例如wog_df、wog_character、wog_monster等

套用在其他像wog_player、wog_message等常更新的資料上幫助不大,甚至可能會拖慢速度

另外,若使用這種快取的話,必須在對相關資料作出更新後再將快取文件刪除,不然玩家就沒辦法立即取得更新的資料(也就喪失使用資料庫的意義了…)

以上提供給各位參考看看,有任何問題或指正歡迎提出 :wink:



最後由 涅魂 於 2007-02-27 9:23 pm 編輯,總共編輯了 3 次。
圖檔


涅魂
 
文章: 4463
註冊時間: 2004-01-04 11:17 am
來自: Taiwan
性別: 男生

文章涅魂 » 2007-02-16 8:33 am

再附上運作速度更快的Func2
代碼: 選擇全部
function func2()
{
   if(!file_exists('./df_cache/df.txt') || filemtime('./df_cache/df.txt')+60*60 < time())
   {
      $s='';
      $fp=fopen('./df_cache/df.txt','w');
      $result=$DB_site->query("SELECT d_id,d_name FROM wog_df");
      while($d=$DB_site->fetch_array($result))
      {
         $s.=$d['d_id'].','.$d['d_name']."\r\n";
      }
      fputs($fp,$s);
      fclose($fp);
   }
   $fp=fopen('./df_cache/df.txt','r');
   while(fscanf($fp,'%d,%s',$d['d_id'],$d['d_name']))
   {
      
   }
   fclose($fp);
}

運作速度 寫:快取未建立
代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.049505 秒.
Method 1 運作時間:0.021671 秒.
Method 2 運作時間:0.027834 秒.
Method 1 比 Method 2 快 128.4389275991 %

代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.050938 秒.
Method 1 運作時間:0.02209 秒.
Method 2 運作時間:0.028848 秒.
Method 1 比 Method 2 快 130.59302851969 %

代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.046093 秒.
Method 1 運作時間:0.019738 秒.
Method 2 運作時間:0.026355 秒.
Method 1 比 Method 2 快 133.52416658223 %

快取已建立
代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.023791 秒.
Method 1 運作時間:0.020769 秒.
Method 2 運作時間:0.003022 秒.
Method 2 比 Method 1 快 687.26009265388 %

差別在於這個func2建立快取的速度比前一篇的func2要快得些 :wink:



圖檔


回到 精華區

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 2 位訪客