用于随机查找的 JavaScript Map 比 Object 慢得多?

5 javascript ecmascript-6

考虑以下两个片段(来自这个 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];
}
Run Code Online (Sandbox Code Playgroud)

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

题:

为什么普通的旧 javascript 对象的性能Map超过 5 倍?这仅仅是因为在写作时,Maps 仍然非常新且未经优化吗?或者在Map查找中是否有一些开销会始终阻止它像 POJO 一样快?

如果它还没有优化,我们能期望它最终比随机查找的 POJO 更快吗?为什么?为什么不?

小智 8

感谢@Bergi 的回答。

与 jsperf 相比,纯 JavaScript 对象在初始 jsperf 中表现如此出色的原因是Map,在底层,JS 引擎可以看到我们像使用数组一样使用该对象(连续的整数键),因此它“假设”它是一个数组,并可以基于它进行一系列优化。但Map.

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

  • 该链接已失效。 (5认同)