【问题标题】:Iterating a huge list better alternative approach迭代一个巨大的列表更好的替代方法
【发布时间】:2018-11-04 10:46:49
【问题描述】:

我有一个文本输入,用户在其中输入搜索词,我将此搜索词拆分为一个字符串数组,使用这些搜索词搜索列表项的名称和描述。这是我的代码,但它在我的设备上运行速度非常慢。 (我仔细检查了缓慢是来自for each 循环而不是RecyclerView)。任何人都可以建议我一个更好/更快替代方案的好例子吗?

ArrayList<CustomItem> original_list = getListFromDatabase();
    ArrayList<CustomItem> filtered_list = new ArrayList<>();

    String input_word = search_word.trim().toLowerCase(); // search_word is assigned by an input field
    String[] parts = input_word.split(" ");

    if (original_list != null) {
        for (CustomItem item : original_list) {
            int number = 0;
            for (String part : parts) {

                if (item.getName().toLowerCase().contains(part) || item.getDescription().toLowerCase().contains(part)) {
                    ++number;
                }
            }
            if (number == parts.length) filtered.add(item);
        }
    }

    // lastly I assign my filtered list to a RecyclerView

    if (adapter != null) adapter.search(filtered);

【问题讨论】:

  • 缓慢来自item.getName().toLowerCase()item.getDescription().toLowerCase()toLowerCase()。对于每次迭代,它需要在内存中生成一个新的小写字符串。想一些方法来避免这种情况。一种方法是保留小写列表。

标签: java android list for-loop


【解决方案1】:

有一些简单的事情,例如:您为每个项目重复调用toLowerCase()。您应该在该内部循环之前执行一次

但除此之外,除了(潜在的)使用多个线程来并行处理数据的多个部分之外,剩下的不多了。但这对于 CPU 速度较慢的小型设备无济于事。

除此之外,其他解决方案需要后退一步:有时您必须设计完整的数据模型来支持最关键的性能用例。如果上述计算经常发生,那么已经存储小写字符串可能会很有用,以避免以后这样做的开销。

或者,您可能需要研究服务器端解决方案,其中大部分数据驻留在服务器上,然后您在所述服务器上应用全文搜索引擎来完成繁重的工作。

所以,很明显,有很多选择,你应该做什么取决于你的背景、要求和资源!

【讨论】:

  • 哇。我从没想过这个小代码会导致这一切。现在的差别真的很大!谢谢。
【解决方案2】:

您可以考虑并行流本身并检查性能差异。由于您实现的功能确实需要任何顺序进行处理..

original_list.parallelStream()... 

在此之后过滤或执行 forEach.. 如您所愿。

希望这会有所帮助。干杯!!!

【讨论】:

  • 显然,这是一种启用多线程的“简单”方式。但老实说:为了具有真正的价值,必须查看许多细节。它从流上实际发生的处理开始。以及诸如:并行处理实际上是否可能之类的问题。除此之外,parallelStream() 会带来很多开销,而功能较弱的 Android 设备在使用它时可能会给您带来更糟糕的运行时...
  • 其实我已经提到,如果没有顺序或顺序的要求,那么parallelStream 是一个不错的选择。事实上,我提到要尝试一下,并没有提到这是完美的解决方案。 :)
  • 大多数时候只是说“试试这个”并不是一个好的“答案”......
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 2017-03-06
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多