【问题标题】:How to do nested loops without causing memory leaks in flutter如何在不导致内存泄漏的情况下进行嵌套循环
【发布时间】:2020-09-14 19:09:52
【问题描述】:

我需要使用查询列表进行嵌套循环,而不是循环所有内容,因为它会导致一些内存泄漏和颤动崩溃。 这会导致永远不会结束的冻结。

这里有一个解释:

我有这些课程:

class Station {
String stationName;
}


class Line {
String lineName;
List<station> inLine;
}

现在我有 2 个Line 列表,我需要检查有相互站的线路。这是我使用的代码:

List<Station> mutualStations = [];

for (Line singleLine in listNumberOne) {
  for (Station inline in singleLine.inLine){
     for(line secondLine in listNumberTwo) {
        for(station secondInLine in secondLine.inLine){
            if (inline.name == secondInLine.name) {
                Station instanceOFStation = Station(name: inLine.name);
                mutualStations.add(instanceOFStation);
             }
        }
     }
   }
}

And for sure this code is a huge memory leak and am sure flutter have an easier way to do it .. anyone can help?

【问题讨论】:

  • 当您说“泄漏”时,是否真的存在泄漏,或者仅仅是峰值内存使用率高于您的预期?也许您可以分享(a)崩溃的细节; (b) 您如何诊断内存“泄漏”的详细信息。
  • 它只是冻结,唯一摆脱它的方法就是关闭应用程序
  • 就像 Rob 说的,这里没有无限循环或任何东西。也许只是一些繁重的处理?在每个循环的开头(以及在您的 if 条件内)放置一些 print 语句,以查看发生了什么。

标签: android ios flutter memory-leaks


【解决方案1】:

我不是 Flutter 方面的专家,如有错误请指正,但我认为这段代码是运行在 UI 线程上的,它也负责渲染 UI 元素。所以,如果UI线程在上面的代码中很忙,你的APP会冻结一段时间。

我不禁注意到你的算法是O(n^4),非常慢。考虑到列表包含 10 行,每行包含 10 个站点,循环将迭代 10^4 次,即 10,000 次。

此外,如果有 50% 的匹配站,那么您将在循环内创建大约 5,000 个对象,因为您尚未检查站是否重复。

我可以提供的优化之一是创建两组不同的电台名称。然后遍历它们以确定相互的站点。

因此,要创建集合,您将使用 O(n^2) 循环两次,然后在集合 O(m) [ m -> 集合中的站数] 上循环一次。

所以考虑到最坏的情况,我们会得到所有站名都是唯一的,解决方法如下:

2 * O(n^2) + O(m) => 2 * 100 + 200 => 400 iterations

其中将时间和内存消耗优化了 96%(从 10,000 次迭代到 400 次迭代)。这减少了 UI 线程的负载并使您的应用程序响应用户。 此外,通过避免大量的对象分配,您可以避免应用程序发生内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多