性能

2015-05-20 43 views
1

在ECMAScript中6,I有两个方法来定义的字典:性能

传统方法(带dictionary = Object.create(null)):

  • 集属性:dictionary.key = valuedictionary[key] = value

  • 获取属性:dictionary.keydictionary[key]

使用地图(与dictionary = new Map()):

  • 设置的参考:dictionary.set(key, value)

  • 得到一个参考:dictionary.get(key)

在V8中,都给予同样的性能?

+1

你应该决定你需要,而不是对性能的语义。 – Bergi

+2

但我的问题真的是关于性能,更好的语义是什么? – DMaster

+0

那么,他们有*不同*的语义。除了对象被限制在字符串键之外,你还需要考虑原型继承,所以'Object'实例不是最好的想法,如果有的话,你可以使用'Object.create(null)'。但通常情况下,如果字典可用,则需要使用“Map”。 – Bergi

回答

1

您可以使用JSPerf在herehere上自行测试。看起来结果会因V8版本而异。

+0

这些测试处理这样一个小数据集。当有大约500,000个键/值对时,我最感兴趣的是map.get性能。 –

-1

原则上Maps()意味着可变的键值存储,并且可能[不保证]被实现为散列映射。

另一方面,JavaScript引擎会尝试根据创建对象的位置和方式来派生对象形状(将它们视为特定对象类型的隐式类定义),并在特定的关键点处给它们一个固定的布局修复了相对于对象头部的偏移量。这对于一组固定的小键来说效果很好(比hashmaps更容易缓存)。

如果javascript引擎检测到对象不符合某些特定形状,他们会将它更像地图而不是它。

所以一般的指导是:如果你事先知道密钥并且他们的数字不超过十几个,你可以在前面设置他们的值为null你可以使用对象。

如果您有数百键或动态生成的密钥处理,然后用Map()