javascript - map方法的原生实现怎么这么快?

标签 javascript performance dictionary testing

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/

相关文章:

mysql - 如何获取有关 MySQL 在新行插入期间更新索引所用时间的统计信息

c# - 获取字典列表<string, string>中具有特定键的所有不同值

尽管有数据,python folium map 标记不显示在 map 上

json - 如何在 jsonObject swift 4 中获取 jsonObject 的值?

javascript - 具有动态参数的主干模型 url

javascript - 如何使用jquery检测动态添加的点击元素?

javascript - 为什么html元素的类名没有改变?

javascript - React - 从 API 返回数据

c++ - 如何加速这个 Rcpp 函数?

java - Netbeans 开发 PHP 脚本时速度很慢