考虑以下两个片段(来自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
是Map
,obj
是普通的旧JavaScript对象(let obj = {}
),indices
是随机索引数组。 obj
和map
都预先填充了数据,因此查找实际返回数据。查看jsperf以获取完整代码。
为什么普通的旧javascript对象超出Map
因子5?这仅仅是因为在写作时,Map
仍然是非常新的和未经优化的?或Map
查询中是否有一些开销会使其不能像POJO一样快?
如果它尚未优化,我们是否可以期望它比POJO更快地随机查找最终?为什么?为什么不呢?
答案 0 :(得分:3)
感谢@Bergi的回答。
普通JavaScript对象在初始jsperf中与Map
相比表现如此之好的原因是因为在引擎盖下JS引擎可以看到我们正在使用像它一样的对象。数组(连续的整数键),所以"假设"它是一个数组,可以根据它进行一系列的优化。使用Map
时不是这样。
但是Map
还有一个缺点,就是它需要一个方法调用(map.get(p)
),而不是直接属性查找(obj[p]
)。如jsperf所示,这还没有(不能?)被优化掉:http://jsperf.com/map-vs-pojo-lookups