【问题标题】:Complexity of accessing data in an object访问对象中的数据的复杂性
【发布时间】:2017-12-29 05:37:02
【问题描述】:

在我日常工作中正在进行的一些项目中,我需要访问非常大的 JS 对象中的数据(大约有数千个键值对)。我正在努力提高我的代码的效率,所以我想出了几个问题:

  1. 访问此类对象中的字段时,JS 的运行时复杂度是多少? 我最初的预感是 O(n)
  2. 通过点符号或括号符号访问时有区别吗? (例如 obj.fieldobj[field]
  3. 我猜对于不同的运行时引擎会有不同的答案 - 有没有可以看出它们之间区别的地方?

【问题讨论】:

  • 在 V8 上还取决于对象如何受到威胁。例如,如果使用delete,则该对象会在内部转换为另一种性能较低的类型。看看Map。不知道性能,但可能更快(在你的情况下,我的意思是)。

标签: javascript json node.js time-complexity


【解决方案1】:

在最坏的情况下,JS 对象表示为hash table,并且具有相同的查找复杂度:O(1) on average but O(n) at worst。我猜哈希表实现是你的情况,因为你在对象中有很多项目。访问属性的方式没有区别,obj.fieldobj['filed'] 是一样的。

还值得一提的是,复杂性并不总是等于哈希表查找的复杂性,在很多情况下它会更快。现代 JS 引擎使用称为 hidden classesinline caching 的技术来加快查找速度。这是一个很大的问题,这些技术是如何工作的,我已经在another answer 中解释过。

一些相关资源:

【讨论】:

  • 如果它是用 Hast Table 实现的。时间复杂度最坏的情况是 O(n) 或至少 O(log n)。怎么可能是 O(1)?
  • @tsh 确实是我写错了,谢谢指正!我已经更新了答案。
【解决方案2】:

Javascript 对象实际上是哈希,因此所有引擎的复杂度为O(1)

obj.fieldobj['field'] 的别名,所以它们的性能是一样的。

你可以找到一些 JS 哈希性能测试here,不幸的是只适用于你的浏览器引擎。

【讨论】:

    猜你喜欢
    • 2020-03-21
    • 2018-08-28
    • 2021-01-21
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多