[英]Why is recursion in javascript so slow?
我剛剛在jsperf上運行了這個基准測試: https ://jsperf.com/mapping1
我試圖看看使用遞歸的地圖是否可以擊敗Array.prototype
映射函數。 我失去了。 可怕的。 有人可以解釋原因嗎?
map = function(f, xs) {
if (xs.length === 0) {return []}
return [f(head(xs))].concat(map(f, tail(xs)))
}
// head() and tail() do exactly what you would expect. I wish there was a way to programmatically fork lists in js...
這里是遞歸的rapidMap實現,但沒有concat,它比map快20倍,只比原生Array.map慢1.5倍:
var Cx = function(){
this.map = function (f, xs) {
if (xs.length === 0) {return []}
return [f(head(xs))].concat(arguments.callee(f, tail(xs)))
}
this.fasterMap = function(f, xs, i) {
i = i || 0;
if (xs.length === 0 || i > xs.length - 1) {return []}
xs[i] = f(xs[i])
arguments.callee(f, xs, i + 1)
return xs
}
this.arrMap = function (f, xs) {
return xs.map(f)
}
}
function head(arr){return arr[0]}
function tail(arr){return arr.slice(1)}
function add1(x){return x + 1}
function rep(n,f){
for(var i = 0; i < n; i++)
f(i)
}
var cx = new Cx()
;[9,99,999].forEach(function(n){
var test = []
rep(n,function(i){test.push(i + 1)})
;['map','fasterMap','arrMap'].forEach(function(mapType){
var mapFn = function(){return cx[mapType](add1,test)}
if(n < 10)
console.log(' ' + mapType,mapFn())
else{
console.time(' ' + mapType + ' ' + n)
rep(1000,mapFn)
console.timeEnd(' ' + mapType + ' ' + n)
}
})
})
以下是Cloud9 IDE的測試結果:
map [ 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
fasterMap [ 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
arrMap [ 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
map 99: 45ms
fasterMap 99: 8ms
arrMap 99: 7ms
map 999: 2227ms
fasterMap 999: 102ms
arrMap 999: 85ms
所以答案是concat使你的地圖功能變慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.