object.property 和 map.get(对象)之间的性能
performance between object.property and map.get(object)
在 ECMAScript 6 中,我有两种定义字典的方法:
传统方法(dictionary = Object.create(null)
):
设置属性:dictionary.key = value
或dictionary[key] = value
得到属性:dictionary.key
或dictionary[key]
使用地图(dictionary = new Map()
):
设置参考:dictionary.set(key, value)
获取参考:dictionary.get(key)
在 V8 中,它们提供相同的性能吗?
原则上 Maps() 是可变的 key-value 存储,并且很可能 [不保证] 作为散列映射实现。
另一方面,javascript 引擎将尝试派生 object 形状(将它们视为特定类型 object 的隐式 class 定义)基于object 的创建位置和方式,并为它们提供固定布局,其中特定键相对于 object header 具有固定偏移量。这适用于一小部分固定键集(cache-friendlier 比 hashmaps)。
如果 javascript 引擎检测到 object 不符合某些特定形状,他们会将其视为地图。
所以一般指导是:如果您提前知道密钥并且它们的数量不超过十几个,您可以预先将它们的值设置为 null
您可以使用 objects.
如果您要处理数百个密钥或动态生成的密钥,请使用 Map()
在 ECMAScript 6 中,我有两种定义字典的方法:
传统方法(dictionary = Object.create(null)
):
设置属性:
dictionary.key = value
或dictionary[key] = value
得到属性:
dictionary.key
或dictionary[key]
使用地图(dictionary = new Map()
):
设置参考:
dictionary.set(key, value)
获取参考:
dictionary.get(key)
在 V8 中,它们提供相同的性能吗?
原则上 Maps() 是可变的 key-value 存储,并且很可能 [不保证] 作为散列映射实现。
另一方面,javascript 引擎将尝试派生 object 形状(将它们视为特定类型 object 的隐式 class 定义)基于object 的创建位置和方式,并为它们提供固定布局,其中特定键相对于 object header 具有固定偏移量。这适用于一小部分固定键集(cache-friendlier 比 hashmaps)。
如果 javascript 引擎检测到 object 不符合某些特定形状,他们会将其视为地图。
所以一般指导是:如果您提前知道密钥并且它们的数量不超过十几个,您可以预先将它们的值设置为 null
您可以使用 objects.
如果您要处理数百个密钥或动态生成的密钥,请使用 Map()