[分享]函式運作速度比較:陣列取值篇

WOG設定安裝教學

版主: 涅魂, 簫哥


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

[分享]函式運作速度比較:陣列取值篇

文章涅魂 » 2007-02-18 11:15 am

從這次開始改成直接以程式碼來敘述,省略呼叫函式的時間以增進運算時間的可靠性
方法1 寫: while(list($key,$value) = each($arr))
{

}
reset($arr);

方法2 寫: foreach($arr as $key=>$value)
{

}

方法1是傳統的陣列取值方式,方法2則是較新的使用方式

而方法1的each()函式因為只會將指標移往當前的下一個,所以必須在最後加上reset()來重設,
方法2的foreach則會自動重設,所以不需要再使用reset
運作速度 寫:
代碼: 選擇全部
總運作次數: 100 次.
總運作時間: 0.0066659999999999 秒.
[color=brown]Method 1[/color] 運作時間:0.0042859999999999 秒.
[color=olive]Method 2[/color] 運作時間:0.002369 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 80.920219501899 [/color]%

代碼: 選擇全部
總運作次數: 100 次.
總運作時間: 0.005033 秒.
[color=brown]Method 1[/color] 運作時間:0.0032759999999999 秒.
[color=olive]Method 2[/color] 運作時間:0.001748 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 87.41418764302 [/color]%

代碼: 選擇全部
總運作次數: 100 次.
總運作時間: 0.005013 秒.
[color=brown]Method 1[/color] 運作時間:0.0032530000000001 秒.
[color=olive]Method 2[/color] 運作時間:0.0017509999999999 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 85.779554540272 [/color]%

運算一次的比較(省去方法1的reset) 寫:
代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.000107 秒.
[color=brown]Method 1[/color] 運作時間:6.7000000000011E-005 秒.
[color=olive]Method 2[/color] 運作時間:3.0999999999975E-005 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 116.12903225827 [/color]%

代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.00012299999999998 秒.
[color=brown]Method 1[/color] 運作時間:7.5999999999965E-005 秒.
[color=olive]Method 2[/color] 運作時間:3.6999999999954E-005 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 105.40540540557 [/color]%

代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.00010599999999999 秒.
[color=brown]Method 1[/color] 運作時間:6.600000000001E-005 秒.
[color=olive]Method 2[/color] 運作時間:3.1000000000003E-005 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 112.90322580646 [/color]%

新寫法與舊寫法的差異應該很容易就能看得出來了,給大家參考看看囉 :wink:[quote="ETERNAL"]<u>積分 +1</u>

謝謝分享經驗

補充一下foreach在以前perl就有了

php後來才加入這個函數

不過大部分的人還是習慣用舊的方式while來取值,連書上也是

不知跟for($i;$i;count($arr);$i++)
比較起來效率上如何

at 2007-02-26 11:05 pm[/point]


最後由 涅魂 於 2007-05-01 10:27 pm 編輯,總共編輯了 1 次。


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

文章涅魂 » 2007-02-26 11:51 pm

下列為for()與foreach()的比較,先列出基礎數據與程式內容
代碼: 選擇全部
$arr=array(1,2,3,4,5,6,7,8,9,10,21,45,789,546,511);
//Method 1
for($a=0;$a < $process_time;$a++)
{
   for($i=0;$i < count($arr);$i++)
   {
      
   }
}
//Method2
for($b=0;$b < $process_time;$b++)
{
   foreach($arr as $key => $value)
   {
      
   }
}

運作 1 次($process_time = 1) 寫:
代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 9.5999999999985E-005 秒.
[color=brown]Method 1[/color] 運作時間:5.3999999999998E-005 秒.
[color=olive]Method 2[/color] 運作時間:3.3999999999978E-005 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 58.823529411861 [/color]%

代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.00010600000000005 秒.
[color=brown]Method 1[/color] 運作時間:5.6000000000056E-005 秒.
[color=olive]Method 2[/color] 運作時間:4.0999999999958E-005 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 36.585365853936 [/color]%

代碼: 選擇全部
總運作次數: 1 次.
總運作時間: 0.00010500000000002 秒.
[color=brown]Method 1[/color] 運作時間:5.7000000000085E-005 秒.
[color=olive]Method 2[/color] 運作時間:3.9999999999929E-005 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 42.500000000465 [/color]%

運作 5 次 寫:
代碼: 選擇全部
總運作次數: 5 次.
總運作時間: 0.00029000000000001 秒.
[color=brown]Method 1[/color] 運作時間:0.000141 秒.
[color=olive]Method 2[/color] 運作時間:0.00014000000000003 秒.
 [color=olive]Method 2[/color] 比 [color=brown]Method 1[/color] 快[color=blue] 0.71428571426646 [/color]%
運作 20 次 寫:
代碼: 選擇全部
總運作次數: 20 次.
總運作時間: 0.00098300000000001 秒.
[color=brown]Method 1[/color] 運作時間:0.00045400000000001 秒.
[color=olive]Method 2[/color] 運作時間:0.00051999999999999 秒.
 [color=brown]Method 1[/color] 比 [color=olive]Method 2[/color] 快[color=blue] 14.537444933917 [/color]%

運作 50 次 寫:
代碼: 選擇全部
總運作次數: 50 次.
總運作時間: 0.0023299999999999 秒.
[color=brown]Method 1[/color] 運作時間:0.0010749999999999 秒.
[color=olive]Method 2[/color] 運作時間:0.001246 秒.
 [color=brown]Method 1[/color] 比 [color=olive]Method 2[/color] 快[color=blue] 15.90697674419 [/color]%

運作 100 次 寫:
代碼: 選擇全部
總運作次數: 100 次.
總運作時間: 0.0047010000000001 秒.
[color=brown]Method 1[/color] 運作時間:0.002185 秒.
[color=olive]Method 2[/color] 運作時間:0.002507 秒.
 [color=brown]Method 1[/color] 比 [color=olive]Method 2[/color] 快[color=blue] 14.736842105265 [/color]%

運作 1000 次 寫:
代碼: 選擇全部
總運作次數: 1000 次.
總運作時間: 0.045526 秒.
[color=brown]Method 1[/color] 運作時間:0.020743 秒.
[color=olive]Method 2[/color] 運作時間:0.024767 秒.
 [color=brown]Method 1[/color] 比 [color=olive]Method 2[/color] 快[color=blue] 19.399315431712 [/color]%

個人評論 寫:這個的結果比以前的有趣

只運作一次時foreach()的效率比for()快約39%,明顯地較快些

但從之後開始效率卻逐漸下滑,連續運作5次升至有出現過運作速度相等的情況

之後的20次、50次、100次甚至到1000次效率更滑落到-19%

個人認為foreach()效率的滑落可能與foreach()重設陣列的指標有關

所以從一般情況來看(只運作1次)foreach()仍然比for()更具有效率

且foreach()還可以處理利用for()無法處理的字串索引的強大功能(像是$arr['test']、$arr['p_at']之類的)

以上,供大家做個參考 :wink:



圖檔


回到 精華區

誰在線上

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