【问题标题】:Organising JSON object structure for performance [closed]组织 JSON 对象结构以提高性能 [关闭]
【发布时间】:2018-03-11 00:18:04
【问题描述】:

我有一个 30k+ 复杂 JS 对象的列表。列表中的每个对象都有一个 name 属性。

我希望能够在不借助数据库的情况下尽快按名称找到对象。

关于性能的 3 个问题浮现在脑海中。

查询平面列表 - [{name: 'a'}, {name: 'b'}, {name: 'c'}] 还是查询嵌套结构的数据 - { group1 : [{name: 'a'}, {name: 'b'}], group2: [{name: 'c'}] } 更快?

第二个密切相关的问题,查询这个是否更快:

`[{name: 'a'}, {name: 'b'}, {name: 'c'}]`

或者这个:

{ a: {name: 'a'}, b: {name: 'b'}, c: {name: 'c'} }

第三,原生 JS 代码更快还是我应该使用 lodash(因为我的代码可能性能较差???)是否有任何库可以帮助解决这个问题 - JavaScript 库或 npm 包。

【问题讨论】:

  • 这些都与 JSON 无关。
  • 最好的办法可能是使用流式 JSON 解析器而不是 JSON.parse。结构在这里并没有真正的影响。
  • 要通过某个唯一标识符(就像name 似乎是)获取单个项目,这个{ a: {name: 'a'}, b: {name: 'b'}, c: {name: 'c'} } 通常比[{name: 'a'}, {name: 'b'}, {name: 'c'}] 快得多。 O(1) 与 O(n)。当您需要获取数据的子集时,该数组更方便并且可能更快;想想数组#filter。通常我有两个结构并排。但这引入了新的复杂性,因为您现在需要注意使两个结构保持同步。就像您添加/删除/替换项目一样。
  • 具有已知密钥的哈希表访问:O(1)。查找一个未排序数组的项目:O(n) 其中n 是数组长度。在排序数组中查找项目:O(log(n)) 其中n 是数组的长度。对于 30k 长度,如果您需要按名称调用而不是重复搜索数组,您几乎肯定会想要对名称进行散列,但如果您要执行后者,至少先对其进行排序,进行一些缓存等.
  • ... 或根据您的问题来构建它,为您的数据(作为哈希表)执行 b 需要 1 个单位的时间。对排序后的数据(作为数组)进行二进制搜索需要 14 倍的时间。对数据(作为数组)进行暴力搜索需要 30000 倍的时间。

标签: javascript json node.js lodash


【解决方案1】:

1) JS 中的对象是字典,这意味着obj.x 比“在列表中查找 x”更快(可能是即时的)。但是你不会从这个结构中受益,你需要找到 obj.*.name where name = "a" 所以它与在数组/列表中搜索相同。

2) 如果在第二个示例中 (x: {name: 'x'}) x 键始终与字符串 'x' 相同(name 的值),那么在对象中“查找”x 就像 obj['x'] 一样简单(与obj.x 相同)因为它是字典。它已经被键“索引”了。

3) _.find 绝不会比您自己循环遍历数据和returning 当您找到某些东西时更快或更慢。

使用数据库。您可以使用内存中的 JS“搜索”索引。我之前使用过http://fusejs.io/,但没有使用那么多数据。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多