考虑以下两个片段(来自这个 jsperf 条目 https://jsperf.com/map-vs-typedarray-vs-object):
let val = 0;
for(let i of indices) {
val += map.get(i);
}
// ---
let val = 0;
for(let i of indices) {
val += obj[i];
}
Here, map
is a Map https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map, obj
是一个普通的旧 JavaScript 对象(let obj = {}
), and indices
是随机索引的数组。两个都obj
and map
已预先填充数据,因此查找实际上返回数据。查看 jsperf 获取完整代码。
问题:
为什么普通的旧 javascript 对象的性能优于Map
5+ 倍?这仅仅是因为在撰写本文时,Map
仍然很新且未经优化?或者有一些开销Map
查找总是会使其无法像 POJO 一样快?
如果它还没有优化,我们是否可以期望它比随机查找的 POJO 更快最终?为什么?为什么不?
感谢@Bergi 的回答。
与 jsperf 相比,纯 JavaScript 对象在初始 jsperf 中表现如此出色的原因Map
是因为在底层,JS 引擎可以看到我们正在使用该对象,就像它是一个数组(连续的整数键)一样,因此它“假设”它是一个数组,并且可以基于此进行一系列优化。情况并非如此Map
.
But the Map
还有一个缺点是它需要方法调用(map.get(p)
),而不是直接属性查找(obj[p]
)。正如这个 jsperf 所示,这还没有(不能?)优化掉:http://jsperf.com/map-vs-pojo-lookups http://jsperf.com/map-vs-pojo-lookups
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)