2010-08-09 51 views
6

有沒有人做過基準測試,或者可以鏈接到關於此主題的文章?特別對IE結果感興趣,因爲通常JS性能在其他瀏覽器中不是問題。使用函數式Javascript與「程序式」的性能影響

我想知道它是多麼慢得多做一些事情,如:

var numbers = [1, 2, 3, 4, 5, 6, 7]; 
var results = numbers.map(function() { 
    // do some stuff 
}); 

而不是典型的:

var numbers = [1, 2, 3, 4, 5, 6, 7]; 
var results = []; 

for (var i = 0; i < numbers.length; i++) { 
    var number = numbers[i]; 
    var result; 
    // do some stuff 
    results.push(result); 
} 

我顯然更喜歡實用的風格,但我相信額外的爲每個項目調用額外功能的開銷可能會導致大集合減慢速度。

謝謝!

+0

可能是一個爭論點,但IE <9甚至不實現'[] .map'。你正在修補'Array.prototype'你自己? – 2010-08-09 16:00:59

+2

Erlang成名的Joe Armstrong總是在提問這樣​​的問題時給出建議,程序員應該編寫他們可以編寫的最漂亮的程序。按照您希望反映的想法進行編碼 - 當然,請使用優質合適的基本算法! - 讓讓V8,Tracemonkey和JScript的人們更快地處理函數調用。不要讓自己的代碼在一年內無法讓事情變得更快。 – Pointy 2010-08-09 16:04:30

+0

@新月是修補Array.prototype,或使用類似這樣的東西:http://documentcloud.github.com/underscore/ – adamJLev 2010-08-09 16:30:25

回答

3

對這個問題缺乏證據感到滿意,我寫了一個簡短的基準。這遠非完美,但我認爲它回答了這個問題。

我在IE 8/win中運行它,雖然功能方法比較慢,但它永遠不會成爲真正代碼中的瓶頸。 (除非你做的東西,你不應該在客戶端做反正)

因此,我將使用更簡潔的方法,每當我要挑(耶)

(最佳的5)
實用的方法:453ms
老學校的做法:156ms

Array.prototype.map = function(fun) { 
    var len = this.length >>> 0; 
    if (typeof fun != "function") 
    throw new TypeError(); 

    var res = new Array(len); 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) { 
    if (i in this) 
     res[i] = fun.call(thisp, this[i], i, this); 
    } 

    return res; 
}; 

/** 
* 
* 
*/ 

// Initialize test array 
var numbers = []; 
for (var i = 0; i < 100000; i++) numbers.push(i); 

// Benchmark! 
var start = +new Date(); 

// Test 1 
var results1 = numbers.map(function(num) { 
    return num + num; 
}); 

alert('1. Functional map:' + (start - new Date())); 
start = +new Date(); 

// Test 2 
var results2 = []; 
for (var j = 0, l = numbers.length; j < l; j++) { 
    var num = numbers[j]; 
    results2.push(num + num) 
} 

alert('1. Old school approach' + (start - new Date())); 
start = +new Date(); 
+0

每當我聽到有關microoptimization:https://www.youtube.com/watch?v=65-RbBwZQdU&feature=youtu.be – Memke 2017-03-11 17:31:08