【发布时间】:2020-06-12 18:14:55
【问题描述】:
我很高兴使用 Map 在我的 JavaScript 代码库中的任何地方进行索引访问,但我偶然发现了这个基准:https://stackoverflow.com/a/54385459/365104
我也在这里重新创建了它:https://jsben.ch/HOU3g
基准所做的基本上是用 1M 元素填充地图,然后对其进行迭代。
我希望 Map 和 Object 的结果是相同的,但它们有很大的不同 - 有利于 Object。
这是预期的行为吗?可以解释吗?是因为订购要求吗?还是因为 map 正在做一些关键散列?或者仅仅因为 Map 允许任何对象作为键(我希望它使用指针地址作为键,这不需要任何散列)? Map和Object索引算法有什么区别?
这是非常出乎意料和令人沮丧的 - 基本上我将不得不恢复到老式的“对象即地图”编码风格。
更新 #1
根据 cmets 的建议,Object 可能会优化为 Array(因为它是按整数索引的,从零开始)。
将迭代顺序从 size 更改为 0 - 对象仍然是 2x faster。使用字符串作为索引时,Map 的性能提高了 2 倍。
【问题讨论】:
-
这可能会遇到对象即数组(例如整数索引)优化。将
"x" + i存储为键 - 那么性能要么相同,要么在没有迭代的情况下使用 Map 领先。此外,基准具有不同的输出,一个存储1,另一个存储i;尽管这对整体性能没有影响。 -
tldr;如果使用非整数键(包括不是整数值的字符串),则 Map 一样快或更快。
-
我希望对象的实现得到超级优化,因为对象是 javascript 的核心,并且涉及从
console.log()调用到Map的实现(它本身就是一个对象)的所有内容.如果出现某些东西并且比对象更快,我会感到非常惊讶,因为这意味着开发人员可以使用该东西重新实现对象以使对象更快
标签: javascript performance dictionary object v8