"foreach" VS "List<T>.Foreach"...哪个更胜一筹

4

在性能水平上讲,更倾向于使用并且编译器工作更轻的选项,有任何重大差异吗?

  List<int> intList;
  foreach (int i in intList)

或者
intList.ForEach(i => result += i);

7
你测量时的结果是什么? - Conrad Frix
你尝试过自我检查吗?你知道如何对代码进行性能测试吗? - user47589
可能是重复的问题: .Net - 当 List<T>.ForEach 优于标准 foreach 循环时? - Ian Mercer
可能是在.NET中,哪个循环更快,for还是foreach的重复问题。 - Amy B
1个回答

17

TL;DR: 在实际应用中,这里的性能差异几乎肯定是微不足道的,而且有一种更易读的方法可以达到相同的结果。然而,查看编译后的代码中的差异仍然很有趣。

假设完整的代码实际上是:

int result = 0;
foreach (int i in intList)
{
    result += i;
}

vs

翻译为:

对比

int result = 0;
intList.ForEach(i => result += i);

那么第一种形式在生成的代码方面相对更简单 - 你最终只会得到一个本地变量,用 List<T>.Enumerator 进行迭代的代码和将值添加到本地变量中的 IL。

第二种形式需要生成一个带有 result 实例变量的新类,并且还需要一个被用作委托的方法。代码将转化为:

CompilerGeneratedClass tmp = new CompilerGeneratedClass();
tmp.result = 0;
Action<int> tmpDelegate = new Action<int>(tmp.CompilerGeneratedMethod);
intList.ForEach(tmpDelegate);

此外,哲学上foreach和ForEach之间存在差异,Eric Lippert曾经写过相关文章(点击查看)。

个人而言,我会选择使用LINQ:

int result = intList.Sum();

我怀疑在实际的代码中,性能差异实际上不会成为瓶颈,但在我看来,LINQ版本最清晰,这总是一件好事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接