“foreach”VS“List<T>.Foreach”......哪个获胜

问题描述 投票:0回答:1

说到性能级别,哪个更值得使用,并且在编译器工作方面更轻,有什么重大差异吗?

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

intList.ForEach(i => result += i);
c# performance generics foreach
1个回答
17
投票

TL;DR:这里的性能差异在实际应用程序中几乎肯定是微不足道的,并且无论如何都有一种更易读的方法来实现相同的结果。不过,看到编译代码的差异仍然很有趣。

假设完整代码实际上是:

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

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 版本在我看来是最清晰的,这始终是一件好事。

© www.soinside.com 2019 - 2024. All rights reserved.