【问题标题】:Which one is faster? `array.findIndex` vs `array.reduce` + `object[index]` [closed]哪个更快? `array.findIndex` vs `array.reduce` + `object[index]` [关闭]
【发布时间】:2020-02-12 07:17:16
【问题描述】:

我在 React Native 中有客户端应用程序。此应用使用服务器 REST API。

这是来自 API 的数据示例:

组:

[
   {
      "id":1,
      "name":"example1",
      "items":[
         {
            "id":1,
            "name":"example1",
            "example":123
         },
         {
            "id":2,
            "name":"example1",
            "example":123
         }
      ]
   },
   {
      "id":2,
      "name":"example1",
      "items":[
         {
            "id":3,
            "name":"example1",
            "example":123
         },
         {
            "id":4,
            "name":"example1",
            "example":123
         }
      ]
   }
]

我将这些数据保存到 Redux 存储中,以便以后访问它们。

我需要对这些数据执行许多操作,例如:deleteGroup,findGroup,deleteItem,findItem, ... 所有这些操作都是按 ID 进行的。

我的问题是,按 ID 搜索值的最快方法是什么。

我看到了 3 个选项:

  1. 在后端将对象数组转换为对象对象,然后使用object[id]访问项目(后端很重)
  2. 在客户端将对象数组转换为对象对象,然后使用object[id]访问项目(客户端重)
  3. 在客户端使用array.findIndex(i => i.id == 3)

array.findIndex 是否比使用 id 键将数组转换为对象更快? 是否有另一种选择如何实现相同但更快?

【问题讨论】:

  • 您可以卸载到前端的任何处理都将减少服务器上的负载。在浏览器接收数据之前您可以进行的任何处理都可以加快页面的呈现速度……您的瓶颈在哪里?是否存在瓶颈或明显差异?
  • @Cerbrus 我现在不确定,因为没有足够的数据开始看到瓶颈,但它肯定会发生。我的问题更多是关于将数组转换为对象(大量预处理)或仅在数组上使用 findIndex 并且没有预处理
  • 如果您有大量的 id 访问,那么最快的方法是根本不使用数组,而是创建一个按 id 引用对象的字典。
  • @Baterka 没有解决性能问题的灵丹妙药。没有一种万能的解决方案。在对数据几乎一无所知的情况下,可能无法说出什么会更好。你最多有 10 个对象吗? 100? 10万?你打算做更多的查找还是更多的插入和删除?这些都会影响哪种解决方案更可取。

标签: javascript arrays object search indexof


【解决方案1】:

哪个更快?

视情况而定,所以我无法回答。但是you can

点击该链接,阅读该文章。我只是想为这个确切的案例添加一些注意事项。四个问题:

A) “对象的对象”或“对象的数组”在 JSON 中表示是否更短(从而更快地传输到客户端)?请记住,许多客户端的带宽非常有限,因此加载时间是一项功能。如果加载速度更快,更多人可以使用它。

B) 你能在不同的客户之间分享计算的结果吗?在这种情况下,将计算转移到服务器可能更有意义(如果这与 A 没有太多冲突的话)。

C) 在一个页面加载时,您实际上是如何经常通过 id 查找对象?将数组转换为查找结构通常需要 O(n),但更重(分配内存,计算散列),而搜索速度很快而且 O(n)。但是,地图查找是 O(1),因此您执行的查找越多,查找结构就越有可能变得更有效。此外,与搜索相比,您拥有的元素越多,查找的效率就越高。遍历 10 个元素可能比计算哈希并查找它要快,因此对于小型数据集,哈希表可能永远不会更有效。

  lookupEfficiency = timeToBuildTable * n + numberOfLookups * lookupCost * 1;
  arrayEfficiency = numberOfLookups * n * searchCost;

D) 您是否有未使用的服务器资源(您是否按实例或使用量付费)?如果是,将计算移至服务器免费,否则您应该考虑将计算移至客户端,因为客户端是免费的。另外:哪个更快?普通的客户端还是你的服务器?

如您所见,对于“哪个更快?”没有一个明确的答案。也不是“哪个更好?”。问自己上面的问题,获取一些数据(测试它!),然后做出决定。

【讨论】:

    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2020-10-08
    • 2020-12-28
    • 1970-01-01
    • 2012-12-24
    • 2014-07-06
    相关资源
    最近更新 更多