javascript循環性能比較

1.數組循環遍歷方法

javascript傳統的數組遍歷有for循環,while循環,以及for-in。
本篇文章要比較的是如下幾種循環遍歷方法:javascript

遍歷方式 備註
正向for循環  
逆向for循環 減小一次控制條件比較,性能理論上比正向for循環稍好
while循環  
for-in循環 理論性能最差
for-each循環  
duff's device 循環 利用併發,理論性能最好wiki 介紹

 

 

 

 

 

2.代碼:

var number = 100000;//array大小
var iteranum = 100;//迭代次數
var array = [];
for(let i=0;i<number;i++)
{
    array[i] = i+1;
}

//test cicle 
var len = array.length;
//正常for循環
console.time('normal for');
for(let k=0;k<iteranum;k++)
{
    for(let i=0;i<len;i++)
    {
        array[i]+1;
    }
}
console.timeEnd('normal for');
//倒序for循環
console.time('reverse for');
for(let k=0;k<iteranum;k++)
{
    for(let i=len-1;i--;)
    {
        array[i]+1;
    }
}
console.timeEnd('reverse for');

//while循環
console.time('while');
for(let k=0;k<iteranum;k++)
{   
    let i=0;
    while(i<len)
    {
        array[i]+1;
        i++;
    }
}
console.timeEnd('while');

//for-in循環
console.time('for-in');
for(let k=0;k<iteranum;k++)
{
    for(let i in array)
    {
        array[i]+1;
    }
}
console.timeEnd('for-in');

//for each 循環
console.time("for each");
for(let k=0;k<iteranum;k++)
{
    array.forEach(function(e){
        e+1;
    });
}
console.timeEnd("for each");

//duff's device 循環
console.time("device's device");
for(let k=0;k<iteranum;k++)
{
    let j = len % 8;
    let templen = len-1;
    while(j){
        j--;
        array[templen--]+1;
    }

    j = Math.floor(len / 8);

    while(j){
        j--;
        array[templen--]+1;
        array[templen--]+1;
        array[templen--]+1;
        array[templen--]+1;
        array[templen--]+1;
        array[templen--]+1;
        array[templen--]+1;
        array[templen--]+1;
    }
}
console.timeEnd("device's device");

  

3.實驗步驟

  • 實驗環境 ,操做系統 windows server 2016, node 8.0,cpu E5-1630 v3 @ 3.7GHz ,內存16G
  • 數組內的數據操做很簡單,就是將每個元素加1,可是不覆蓋原先的數據
  • 實驗將採起多點採樣,數組樣本大小分別設置爲:1000,10000,100000,1000000(1000次如下性能差距不大)
  • 對每種方式分別進行100次仿真疊加,最後取100次的仿真結果平均數,做爲該實驗數據的最終結果。
  • 將結果以折線圖的形式展現
 

4.實驗結果

(1)結果表格(單位:微秒)


遍歷方式/Item數量 1000 10000 100000 1000000
正向for循環 43 456 3840 35679
逆向for循環 37 378 3604 33488
while循環 66 296 2294 20576
for-in循環 87 958 32443 401017
for-each循環 64 395 4272 32435
duff's device 循環 20 235 2137 16364
 

 

 

 

 

(2)結果直方圖

爲告終果展現方便,將全部數據都進行了log轉換html

 

 

幾種數組循環的性能對比

橫向爲數組元素大小,縱向爲運行時間(微秒)的log值。
上圖可見,duff's device方式執行效率一直很高,而for-in方式的效率一直很低,正向for和逆向for效率相差不大,逆向for稍微佔優點。
java

 

5.總結

    • 整體來講for循環和for-each性能至關,在小數據量時也與while性能至關。for-in性能最差,duff's device性能最好。大數據量時,while性能優於for循環和for-each循環。
    • 對於數據量不大的循環(<1000),不用考慮使用哪種性能更好,可讀性是第一位
    • 對於有較大數據量的循環和遍歷,若是性能不是瓶頸,那麼普通的for循環(或者while,do-while,for-each)就能夠了,畢竟可讀性強。
    • 對於較大的數據量,若是array的循環操做已經成爲瓶頸,或者性能很是重要,那麼能夠採用duff's device方案。
    • 任什麼時候候都不建議使用for-in,除非必需要用
 
 
 
相關文章
相關標籤/搜索