对于随机查找,JavaScript Map 比 Object 慢得多?

标签 javascript ecmascript-6

考虑以下两个片段(来自 this jsperf entry ):

let val = 0;
for(let i of indices) {
  val += map.get(i);
}
// ---
let val = 0;
for(let i of indices) {
  val += obj[i];
}

这里,map 是一个 Mapobj 是一个普通的旧 JavaScript 对象 (let obj = {}),而 indices 是一个随机索引数组。 objmap 都已预先填充数据,因此查找实际上会返回数据。查看 jsperf 以获取完整代码。

问题:

为什么普通的旧 javascript 对象的性能优于 Map 5 倍以上?这仅仅是因为在撰写本文时,Map 仍然非常新且未优化吗?或者在 Map 查找中是否存在一些开销,这将始终阻止它像 POJO 一样快?

如果它还没有优化,我们是否可以期望它在随机查找方面比 POJO 更快最终?为什么?为什么不呢?

最佳答案

感谢@Bergi 的回答。

Map 相比,普通 JavaScript 对象在初始 jsperf 中表现如此出色的原因是因为在引擎盖下,JS 引擎可以看到我们正在使用对象,就像它是一个数组(连续整数键),所以它“假设”它是一个数组,并且可以基于它进行一系列优化。 Map 不是这样。

但是 Map 还有一个缺点,它需要一个方法调用 (map.get(p)),而不是直接的属性查找 (obj[p]).正如这个 jsperf 所示,这还没有(不能?)优化掉:http://jsperf.com/map-vs-pojo-lookups

关于对于随机查找,JavaScript Map 比 Object 慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44321324/

相关文章:

javascript - 为什么在JavaScript中修改super.method()失败?

javascript - 检索所有命名的 ES6 导入

javascript - 如何使用 jquery/bootstrap 绘制正方形(不同大小)

javascript - 用户获取请求时出错

javascript - 创建一个正则表达式来匹配数字

javascript - async/await ,未处理的 promise 拒绝已弃用

javascript - 检查同时具有 "unique class and Id"的 Div 是否存在

javascript - 如何使用Java设置和读取cookie值

javascript - ES6 - 有条件地在 Promise 中发出重试信号,直到达到最大重试次数

javascript - ecmascript 中的 "This"引用与普通 JS 相比