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

时间:2017-06-02 05:19:42

标签: 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];
}

此处,mapMapobj是普通的旧JavaScript对象(let obj = {}),indices是随机索引数组。 objmap都预先填充了数据,因此查找实际返回数据。查看jsperf以获取完整代码。

问题:

为什么普通的旧javascript对象超出Map因子5?这仅仅是因为在写作时,Map仍然是非常新的和未经优化的?或Map查询中是否有一些开销会使其不能像POJO一样快?

如果它尚未优化,我们是否可以期望它比POJO更快地随机查找最终?为什么?为什么不呢?

1 个答案:

答案 0 :(得分:3)

感谢@Bergi的回答。

普通JavaScript对象在初始jsperf中与Map相比表现如此之好的原因是因为在引擎盖下JS引擎可以看到我们正在使用像它一样的对象。数组(连续的整数键),所以"假设"它是一个数组,可以根据它进行一系列的优化。使用Map时不是这样。

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