gpt4 book ai didi

javascript - 为什么javascript中的递归这么慢?

转载 作者:数据小太阳 更新时间:2023-10-29 04:50:58 28 4
gpt4 key购买 nike

我刚刚在 jsperf 上运行了这个基准测试:https://jsperf.com/mapping1

我试图查看使用递归的 map 是否可以击败 Array.prototype map 函数。我的丢了可怕的。谁能解释一下为什么?

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...

最佳答案

这里是 fasterMap 的递归实现,但是没有 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 会使您的 map 功能变慢。

关于javascript - 为什么javascript中的递归这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928617/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com