【问题标题】:Im facing Big performance impact on IEnumerable(LINQ) > List(RecyclerView)我面临对 IEnumerable(LINQ) > List(RecyclerView) 的巨大性能影响
【发布时间】:2017-03-03 16:10:52
【问题描述】:

我的项目是商业项目,这里不能发,但是代码过程是:

  1. GetAll(LINQ)
  2. 过滤(Linq)
  3. 将 IEnumerable 结果传递给 RecyclerView 适配器
  4. 适配器将 IEnumerable 转换为 List
  5. 适配器为 ItemCard 充气

对 #4 的性能影响很大,大约 3k 项最多需要 3 秒。

如何减少对性能的影响?

我注意到如果我只是创建一个new List<>(3000),也需要大约 1.5 秒。

或者我不应该使用列表吗?

如果我们不使用 List,Adapter 是如何通过 [位置] 获取数据的。

How to go to particular Item in IEnumerable

ElementAt() 让我的应用在膨胀时完全死机。它似乎在每个项目上都做ToList()。

【问题讨论】:

  • 那是因为主要工作发生在第4步,当IEnumerable在内存中具体化为List,在此之前没有任何处理,它的延迟执行。我的理解是即使你最终只有 3 K 记录,但最初在 GetAll 你会得到很多记录,这会影响性能。
  • GetAll 和过滤时间不到 0.1 秒。如果我没有得到所有数据,我什至无法通过预测过滤这些数据。并且第 4 步花费的时间更少,好像过滤的结果是更少的项目。

标签: c# android sql linq xamarin


【解决方案1】:

我自己发现问题:

3.将 IEnumerable 结果传递给 RecyclerView Adapter

不要将 Enumerable 传递给 Adapter,否则它将在每个项目上重新查询。而是通过列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多