2013-07-23 50 views
4

在這裏看到一個例子:http://jsperf.com/map-vs-for-basic 相反,在Chrome控制檯中,我得到了相反的結果(映射有時比循環快6-10倍)。我會猜測這將是相反的。JavaScript:爲什麼原生Array.prototype.map比Chrome控制檯中的循環更快?

所有的
var input = []; 
for(var i=0;i<10000;i++)input[i]=new Date(i); 
    var output = []; 

function perform(value,index){ 
    return value.toString()+index*index 
} 

console.time(1);output = input.map(perform);console.timeEnd(1); 
// 1: 45.000ms 

console.time(1);for(var i=0;i<input.length;i++)output[i]=perform(input[i],i);console.timeEnd(1); 
// 1: 68.000ms 
+0

原生方法應該是最快的,因爲它是用原生瀏覽器語言(C++)編寫的。但是,結果並不一致(半年前,大多數原生ES5實現的速度要慢得多)。我對同一個問題進行了討論:http://stackoverflow.com/questions/14647470/performance-of-jquery-grep-vs-array-filter – Christoph

回答

4

首先,你的測試是不現實的,因爲:功能「執行」和網頁DOM的更新超過一個循環,並使用「地圖」之間的區別慢得多。也就是說,如果每一步跑步者都需要喝杯咖啡並寫一本書,那就好比比較一下100米。

你應該在一個非常快速的功能上做測試。

爲什麼瀏覽器之間存在差異。

地圖可以在內部實現爲:

  • 與優化天然的/二元函數:在這種情況下,他用的速度要快得多。 Chrome可能會這樣做。
  • 就像一個循環一樣,在這種情況下,性能是相似的,但額外調用「映射」和內部檢查可能需要更多時間。

爲什麼

JavaScript是解釋代碼,也就是說,本機實現更快的可執行文件採取的源代碼,並嘗試執行請求的操作,但是這意味着解析代碼並執行導致樹(很多工作)。本機代碼始終快得多並且進行了優化。

如果map使用本機代碼實現,它允許執行優化和比JS循環更快的代碼(假設兩個實現都是正確的並且是最優的)。

相關問題