【发布时间】:2011-12-03 19:10:42
【问题描述】:
我刚读到这个问题:are there dictionaries in javascript like python?
其中一个答案说您可以使用 JavaScript 对象,例如 Python 字典。真的吗?对象中键查找的性能如何?是 O(1) 吗?向对象添加键是否也是恒定时间(散列)?
【问题讨论】:
标签: javascript dictionary hash
我刚读到这个问题:are there dictionaries in javascript like python?
其中一个答案说您可以使用 JavaScript 对象,例如 Python 字典。真的吗?对象中键查找的性能如何?是 O(1) 吗?向对象添加键是否也是恒定时间(散列)?
【问题讨论】:
标签: javascript dictionary hash
V8 design docs 暗示查找速度至少会这么快,如果不是更快的话:
大多数 JavaScript 引擎使用类似字典的数据结构作为 对象属性的存储 - 每个属性访问都需要一个 动态查找以解析属性在内存中的位置。这 方法使得访问 JavaScript 中的属性通常 比在编程语言中访问实例变量慢,例如 Java 和 Smalltalk。在这些语言中,实例变量位于 由于固定对象,在编译器确定的固定偏移量处 由对象的类定义的布局。访问只是一个问题 内存加载或存储,通常只需要一条指令。
为了减少访问 JavaScript 属性所需的时间,V8 确实 不使用动态查找来访问属性。相反,V8 动态地 在幕后创建隐藏的类。 [...] 在 V8 中,对象发生了变化 添加新属性时它的隐藏类。
由于隐藏类的创建,听起来添加新密钥可能会稍微慢一些。
【讨论】:
是的,您可以假设添加一个密钥,然后使用它进行访问是实际上恒定时间操作。
在后台,JS 引擎可能会应用一些技术来优化后续查找,但对于任何算法而言,您都可以假设 O(1)。
【讨论】:
var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]);比较var second={'1': one, '2': two, '3': 'three'}的效率如何?
查看类似的问题How does JavaScript VM implements Object property access? 和answer。在这里,我描述了 JS 引擎使用的优化技术以及它如何影响键查找性能。我希望这些细节可以帮助你编写更高效的 JS 代码。
【讨论】: