【发布时间】:2023-03-09 17:15:01
【问题描述】:
我有一个基于性能的问题。 有没有办法删除嵌套的 foreach 循环,用更高效的东西代替它们?这是一个例子:
List<foo> foos = SelectAllfoos();
foreach(foo f in foos){
//dosomething
foreach(foo2 f2 in foo.GetFoos2()){
//dosomething
}
foreach(foo3 f3 in foo.GetFoos3()){
//dosomething
}
foreach(foo4 f4 in foo.GetFoos4()){
//dosomething
foreach(foo4_1 f4_1 in f4.GetFoos4_1()){
//dosomething
}
}
}
Obiouvsly 这是我刚刚为这个例子发明的假代码。但是想象一下你有类似的东西。您应该如何提高此方法的性能?
PS:我已经尝试过使用System.Threading.Task.Parallel.ForEach,它可以提高性能,但我的意思是编写此代码的更好方法。
PPS:这是用 C# 编写的,但我的问题涉及更广泛的范围,适用于所有语言。
【问题讨论】:
-
1.这真的取决于这些
somethings 是什么。 2.值得运行一个分析器来找出最慢的部分,这些嵌套循环可能根本不是瓶颈。 3. 并行听起来不错,但是请记住,如果它是服务器应用程序,它可能会减慢其他用户的响应时间,而对于客户端应用程序,它可能会使其他进程(甚至整个操作系统)无响应。一般来说,我不鼓励使用并行性作为低性能的解决方案。 -
我建议使用专用线程查找上述实现
-
有些明显的非答案是“尽量避免首先设计具有多级嵌套的算法”。但是,当您有一个虚构的示例时,很难直接回答“是否有更好的方法来编写此代码”。例如。如果您在 3D 中迭代某些东西,存储所有感兴趣对象的 1D 列表可能会更简单,每个对象都有一个位置。这样,您就不必遍历空白区域。
-
显然,这不适用于您必须进行嵌套(因此“未回答”),但通常当我被问到这个问题时,通常是因为程序员已经嵌套不恰当(我看到的记录是一个9级深的字符串解析器)。
-
一个循环不会因为嵌入另一个循环而变慢。它变成的东西被使用了更多次。
标签: performance foreach nested-loops