【问题标题】:Performance of key lookup in JavaScript objectJavaScript 对象中键查找的性能
【发布时间】:2011-12-03 19:10:42
【问题描述】:

我刚读到这个问题:are there dictionaries in javascript like python?

其中一个答案说您可以使用 JavaScript 对象,例如 Python 字典。真的吗?对象中键查找的性能如何?是 O(1) 吗?向对象添加键是否也是恒定时间(散列)?

【问题讨论】:

    标签: javascript dictionary hash


    【解决方案1】:

    V8 design docs 暗示查找速度至少会这么快,如果不是更快的话:

    大多数 JavaScript 引擎使用类似字典的数据结构作为 对象属性的存储 - 每个属性访问都需要一个 动态查找以解析属性在内存中的位置。这 方法使得访问 JavaScript 中的属性通常 比在编程语言中访问实例变量慢,例如 Java 和 Smalltalk。在这些语言中,实例变量位于 由于固定对象,在编译器确定的固定偏移量处 由对象的类定义的布局。访问只是一个问题 内存加载或存储,通常只需要一条指令。

    为了减少访问 JavaScript 属性所需的时间,V8 确实 不使用动态查找来访问属性。相反,V8 动态地 在幕后创建隐藏的类。 [...] 在 V8 中,对象发生了变化 添加新属性时它的隐藏类。

    由于隐藏类的创建,听起来添加新密钥可能会稍微慢一些。

    【讨论】:

    • 感谢多米尼克!因此,如果我做的查找比散列多,那么使用对象查找作为字典查找对我来说似乎是安全的。
    • 对于 V8,动态查找是否既不用于点表示法也用于方括号表示法?
    【解决方案2】:

    是的,您可以假设添加一个密钥,然后使用它进行访问是实际上恒定时间操作。

    在后台,JS 引擎可能会应用一些技术来优化后续查找,但对于任何算法而言,您都可以假设 O(1)。

    【讨论】:

    • var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]);比较var second={'1': one, '2': two, '3': 'three'}的效率如何?
    【解决方案3】:

    查看类似的问题How does JavaScript VM implements Object property access?answer。在这里,我描述了 JS 引擎使用的优化技术以及它如何影响键查找性能。我希望这些细节可以帮助你编写更高效的 JS 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2011-08-20
      • 2018-12-19
      • 1970-01-01
      相关资源
      最近更新 更多