考虑以下两个片段(来自 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 更快最终?为什么?为什么不呢?
最佳答案
感谢@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/