考虑以下两个片段(来自这个 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];
}
Run Code Online (Sandbox Code Playgroud)
这里,map是一个Map,obj是一个普通的旧 JavaScript 对象 ( let obj = {}),indices是一个随机索引数组。双方obj并map已与数据预填充,因此查找实际返回数据。查看 jsperf 以获取完整代码。
为什么普通的旧 javascript 对象的性能Map超过 5 倍?这仅仅是因为在写作时,Maps 仍然非常新且未经优化吗?或者在Map查找中是否有一些开销会始终阻止它像 POJO 一样快?
如果它还没有优化,我们能期望它最终比随机查找的 POJO 更快吗?为什么?为什么不?
小智 8
感谢@Bergi 的回答。
与 jsperf 相比,纯 JavaScript 对象在初始 jsperf 中表现如此出色的原因是Map,在底层,JS 引擎可以看到我们像使用数组一样使用该对象(连续的整数键),因此它“假设”它是一个数组,并可以基于它进行一系列优化。但Map.
但它Map还有一个缺点,即它需要方法调用 ( map.get(p)),而不是直接属性查找 ( obj[p])。正如这个 jsperf 所示,这还没有(不能?)优化:http://jsperf.com/map-vs-pojo-lookups
| 归档时间: |
|
| 查看次数: |
2531 次 |
| 最近记录: |