考虑以下两个片段(来自这个jsperf条目):
这里,
问题:
为什么普通的 JavaScript 对象的表现要比
如果只是还没有被优化,我们可以期望它最终对于随机查找会比 POJO 更快吗?为什么?为什么不?
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
是一个随机索引的数组。这两个对象都已经预先填充了数据,以便查找实际返回数据。查看 jsperf 获取完整代码。问题:
为什么普通的 JavaScript 对象的表现要比
Map
快 5 倍以上?这仅仅是因为截至目前,Map
还很新,没有被优化吗?或者在Map
查找中存在一些开销,这将使它永远无法像 POJO 那样快?如果只是还没有被优化,我们可以期望它最终对于随机查找会比 POJO 更快吗?为什么?为什么不?
obj = {get(p) { return this[p]; }};
并调用obj.get(i)
来模拟开销,但是微基准测试很容易欺骗我们。 - Bergiobj.get(i)
建议,看起来你是对的!https://jsperf.com/map-vs-pojo-lookups 所以最初的难题是POJO在底层针对整数进行了优化(基本上被转换为数组),以及方法调用开销。随意发布一个带有指向该jsperf的链接的答案。感谢你的帮助! - user993683