map方法的原生实现怎么这么快?
我重新实现了它,它仍然比调用迭代数组的 .map
方法慢 2 倍左右。
这是我的代码:
Array.prototype.toMap = function(cb, ctx) {
if(typeof cb != 'function') {
return
}
var
result = [],
len = this.length
for(var i = 0; i < len; i++) {
result.push(cb.call(ctx, this[i], i, this))
}
return result
}
我正在针对以下代码进行测试:
var
myArr = [10, 10, 10],
myObj = {
addOne: function(n) {
return n + 1
}
}
myArr.toMap(function(value, key, array) {
return this.addOne(value)
}, myObj) // [11, 11, 11]
为了比较,我创建了另一种基于“官方”MDN polyfill (https://mzl.la/2EeddOh) 的方法。以下是结果:
mdn map polyfill: 0.318ms
my map reimplementation: 0.058ms
built in map: 0.021ms
mdn map polyfill: 0.433ms
my map reimplementation: 0.080ms
built in map: 0.029ms
mdn map polyfill: 0.334ms
my map reimplementation: 0.056ms
built in map: 0.029ms
mdn map polyfill: 0.429ms
my map reimplementation: 0.057ms
built in map: 0.021ms
mdn map polyfill: 0.333ms
my map reimplementation: 0.056ms
built in map: 0.021ms
你有什么想法?
最佳答案
正如评论中所讨论的那样,答案是可以使用更接近硬件的语言来实现非常常用的功能,以提供更高的性能。
具体对于 Node.js,这是在 V8 引擎中,V8 确实直接在 C++ 中实现了 Array.prototype.map
:https://github.com/v8/v8/blob/c38cb367e76ee8bd87719dd3699254e74f8ebfd1/src/builtins/builtins-array-gen.cc#L2536
关于javascript - map方法的原生实现怎么这么快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48123875/