for迴圈、forEach、map、filter區別及效率分析
阿新 • • 發佈:2019-01-01
遍歷陣列最常用到的for迴圈,是最為熟知的一種方法,在ES5中定義了一些新的遍歷方法,更加適用於函數語言程式設計,究竟其用法區別在哪,以及效率如何,接著下來親自做個測試看一下。在Script中寫入,
var testData = [];//陣列初始化
var x = 9999;
for(var i = 0; i < x; i++){
testData[i] = i;
}
在每個遍歷開始前和結束後取時間戳的差值,每個測試10次取平均值檢視結果。以下測試結果基於Google瀏覽器。
for迴圈
對於普通的for迴圈來說,取完平均值是7.3ms 優化過的for迴圈,for(var i = 0; i < testData.length; i++){ code... }
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方法
取完平均值是2.1ms,x = 99999時,取值8.9ms,x = 999999時,取值39ms,由此可見,在10^4級別及以下forEach的效率佔有絕對優勢,但從10^5級別開始就走下坡了了。然而用火狐測過以後,結果卻截然不同(見頁底)。testData..forEach(function(v,i,a) { a[i]++;});
map方法
a.map(function(v,i,b) { b[i]++;});
傳遞給map()函式的呼叫方式和傳遞給forEach()函式的呼叫方式一樣,但傳遞給map()函式應該有返回值。耗時是在Google瀏覽器環境下forEach方法的基礎上相應增加的。
filter方法
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.3msa.filter(function(v,i,b) { b[i]++;});
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.7msFirefox環境下的測試結果