三種For循環寫法的性能比較

作者: A JavaScript Fancier  來源: A JavaScript Fancier博客  發布時間: 2010-11-23 17:47  閱讀: 7457 次  推薦: 0   原文鏈接   [收藏]  

  循環作為程序語言的三大邏輯控制結構之一,在實際開發是經常會遇到的。在JavaScript程序的循環結構使用上,我們經常會遇到這種應用。根據一個對象的長度進行循環并對對象每個每個元素進行處理。

  如

 
for(var i=0;i<a.length;i++){
sum
+=a[i]
}

以上只是一個簡單的示例,對于如上程序,很多程序開發者都研究過關于其執行效率的問題。因此就出現了以下的兩種寫法:

 
for(var i=0,iLen=a.length;i<iLen;i++){
sum
+=a[i]
}


for(var i=0,item;item=a[i];i++){
sum
+=item;
}

 
for(var i=0,item;(item=a[i])!=undefined;i++){
sum
+=item;
}

對于三種寫法其性能到底有多大差異呢?到底哪個的效率更高呢?我在自己的機器上對其做了測試:發現在10000條數據以下時三者執行速度差別不大,差別大概在0.01m左右,而且測試結果不穩定。

  然后將數據變為50w條進行測試:三種方法測試結果分別為:
  1182
  981
  1673(而且出現“程序執行緩慢,是否取消該腳本”的提示)

  1572
  1462
  12067(同樣出現了腳本加載緩慢的提示)

  盡管數據并不是非常穩定,但還是能從中發現點什么的。

  速度最快的是第二種寫法:即保存對象長度,避免每次都計算。速度最慢的是第三種寫法:即不關系對象的長度,而根據當前項是否存在來循環。之前我一直以為是第三種寫法速度應該是最快的(因為不用計算長度),今日一測才發現第三種的執行效率如此低下,看來還是避免使用。當然,很多時候我們可能還是不得不使用這第三種寫法。

  測試程序如下:(建議分開對三個程序進行測試,特別是在FF下)

 
<script type="text/javascript">
<!--
var a=[];
for(var i=0;i<500000;i++){
a.push(
100);
}

var sum=0;
var timer1=new Date().getTime();
for(var i=0;i<a.length;i++){
sum
+=a[i];
}
alert(sum
+"\ntime:"+(new Date().getTime()-timer1));

sum
=0;
var timer2=new Date().getTime();
for(var i=0,iLen=a.length;i<iLen;i++){
sum
+=a[i];
}
alert(sum
+"\ntime:"+(new Date().getTime()-timer2));

sum
=0;
var timer3=new Date().getTime();
for(var i=0,item;item=a[i];i++){
sum
+=item;
}
alert(sum
+"\ntime:"+(new Date().getTime()-timer3));
//-->
</script>
0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()