1. 程式人生 > >for迴圈、forEach、map、filter區別及效率分析

for迴圈、forEach、map、filter區別及效率分析

        遍歷陣列最常用到的for迴圈,是最為熟知的一種方法,在ES5中定義了一些新的遍歷方法,更加適用於函數語言程式設計,究竟其用法區別在哪,以及效率如何,接著下來親自做個測試看一下。在Script中寫入,

    var testData = [];//陣列初始化
    var x = 9999;
    for(var i = 0; i < x; i++){
        testData[i] = i;
    }

       在每個遍歷開始前和結束後取時間戳的差值,每個測試10次取平均值檢視結果。以下測試結果基於Google瀏覽器

    for迴圈

        對於普通的for迴圈來說,
    for(var i = 0; i < testData.length; i++){
        code...
    }
        取完平均值是7.3ms         優化過的for迴圈,
    for(var i = 0,len = testData.length; i < len; i++){
        code...
    }
        取完平均值是2.7ms         但是當x = 99999,到達10^5級時,遍歷時間分別是7ms和7.1ms,二者幾乎沒有差別;當 x = 999999時,遍歷時間分別是,14.1ms和14.6ms,前者迴圈耗時比後者要少,即遍歷資料從10^5級別開始普通for迴圈想關閉優化的for迴圈效率更高。

    forEach方法

    testData..forEach(function(v,i,a) { a[i]++;}); 
        取完平均值是2.1ms,x = 99999時,取值8.9ms,x = 999999時,取值39ms,由此可見,在10^4級別及以下forEach的效率佔有絕對優勢,但從10^5級別開始就走下坡了了。然而用火狐測過以後,結果卻截然不同(見頁底)。

    map方法

    a.map(function(v,i,b) { b[i]++;}); 
        傳遞給map()函式的呼叫方式和傳遞給forEach()函式的呼叫方式一樣,但傳遞給map()函式應該有返回值。耗時是在Google瀏覽器環境下forEach方法的基礎上相應增加的。

    filter方法

    a.filter(function(v,i,b) { b[i]++;}); 
        filter()方法返回的陣列元素是呼叫的陣列的一個子集,傳遞的函式用來進行邏輯判定的,該函式返回true或false,同樣的的式子,耗時在Google瀏覽器環境下相比較是map方法的40%左右。 Google for迴圈 普通for迴圈 10^4級 7.3ms 10^5級 7ms 10^6級 14.1ms 優化for迴圈 10^4級 2.7ms 10^5級 7.1ms 10^6級 14.6ms forEach方法 普通for迴圈 10^4級 2.2ms 10^5級 10.1ms 10^6級 41.3ms

Google環境下的測試結果

Firefox for迴圈 普通for迴圈 10^4級 2.4ms 10^5級 3.1ms 10^6級 9ms 優化for迴圈 10^4級 2.4ms 10^5級 3.1ms 10^6級 8.9ms forEach方法 普通for迴圈 10^4級 2.5ms 10^5級 4ms 10^6級 6.7ms

Firefox環境下的測試結果