【问题标题】:JavaScript object vs. array lookup performanceJavaScript 对象与数组查找性能
【发布时间】:2014-10-14 05:45:17
【问题描述】:

在 JavaScript 对象中通过键检索值与遍历单个 JavaScript 对象数组之间的性能差异是什么?

在我的例子中,我有一个包含用户信息的 JavaScript 对象,其中键是用户的 ID,值是每个用户的信息。

我问这个的原因是因为我想使用angular-ui-select 模块来选择用户,但我不能将该模块与 Javascript 对象一起使用 - 它需要一个数组。

从按键查找切换到迭代查找,我会牺牲多少(如果有的话)?

按键:

var user = users[id];

通过迭代

var user;

for (var i = 0; i < users.length; i ++) {
  if (users[i].id == id) { 
    user = users[i]; break;
  }
}

【问题讨论】:

  • 不要将 JavaScript 对象与 JSON 混淆!
  • 这很不公平:线性搜索(您的数组循环)与近乎随机的访问(哈希表实现)
  • 这里有一个快速的基准测试,可以帮助你:jsben.ch/#/Y9jDP
  • 这是过时的解决方案,您总是使用:users.find(user => user.id === id) 这是固定基准:jsben.ch/#/UM0ju
  • @Hatch 也许,但当您需要支持旧版浏览器时则不然。您需要一个 polyfill 用于该方法和一个转译器用于 =&gt; 箭头函数。

标签: javascript


【解决方案1】:

这个问题的答案取决于浏览器,但是,jsperf.com 上有一些关于这个问题的性能测试。它还取决于数据的大小。通常,当您拥有大量数据时,使用对象键值对会更快。对于小型数据集,数组可以更快。

数组搜索的性能会有所不同,具体取决于您的目标项目在数组中的位置。对象搜索将具有更一致的搜索性能,因为键没有特定的顺序。

此外,遍历数组比遍历键更快,因此如果您计划对所有项进行操作,将它们放入数组中可能是明智之举。在我的一些项目中,我两者都做,因为我需要进行批量操作和从标识符中快速查找。

测试:

http://jsben.ch/#/Y9jDP

【讨论】:

  • 从第二个链接看来,for 循环比其他任何循环都快得离谱。我认为直接在对象中查找(知道键)会是最快的..跨度>
  • 嗯,红色的测试结果(最快的),是最好的情况数组搜索。搜索到的项目是第一个,自然是很快的。如果您查看最坏的情况,即该项目在数组中最后存在,它会慢得多。对象搜索具有与位置无关的相当一致的查找性能。
  • 使用适当的高性能解决方案修复了您的测试:jsben.ch/#/UM0ju
  • 正如 Ole 所提到的,对于大量项目,对象查找的性能变得比遍历数组更有效,即使使用性能最高的数组函数也是如此。这是一个数组中包含 10,000 个项目的测试,每个项目中有 10 个键/值对,显示对象与数组相比提高了 > 1000 倍:jsperf.com/object-key-vs-array-find。我的测试代码不是最漂亮的;如果我错过了什么,请告诉我。
【解决方案2】:

这个问题涉及所有编程语言。这取决于许多因素:

  • 当您搜索最后一个键时,集合的大小 - 数组会变慢,而且数组会很长
  • 元素可以重复它们自身吗?如果可以,那么你需要一个数组。如果不是:您需要一个字典(映射),或者您需要编写一个 add 方法,该方法对于每个 add 将迭代您的数组并找到可能的重复项 - 在处理大型列表时可能会很麻烦
  • 平均密钥使用率 - 如果请求最多的 userId 位于列表末尾,您将失去性能。

在您的示例地图中将是一个更好的解决方案。 其次,你需要在你的代码中添加一个中断:)

var user;

for (var i = 0; i < users.length; i ++) {
  if (users[i].id == id) {
     user = users[i]; break;
  }
}

否则你会失去性能:)

【讨论】:

    【解决方案3】:

    关联数组比带编号索引的数组慢得多,因为关联数组通过字符串比较工作,这比数字比较慢得多!

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2011-12-25
      • 1970-01-01
      • 2011-08-20
      相关资源
      最近更新 更多