"foreach"VS"List <T> .Foreach"......获胜

SSh*_*bly 5 c# compiler-construction generics performance foreach

谈到性能水平,这是更好的使用,在编译器工作方面更轻,有什么主要差异?

  List<int> intList;
  foreach (int i in intList)
Run Code Online (Sandbox Code Playgroud)

要么

intList.ForEach(i => result += i);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 14

TL; DR:这里的性能差异几乎肯定在实际应用中无关紧要,并且无论如何都有更可读的方法来实现相同的结果.看到编译代码的差异仍然很有趣.

假设完整代码实际上是:

int result = 0;
foreach (int i in intList)
{
    result += i;
}
Run Code Online (Sandbox Code Playgroud)

VS

int result = 0;
intList.ForEach(i => result += i);
Run Code Online (Sandbox Code Playgroud)

那么第一种形式在生成什么方面相当简单 - 你最终只会得到一个局部变量,迭代列表的代码(使用List<T>.Enumerator)和IL将值添加到局部变量.

第二种形式需要生成一个带有实例变量的新类result,以及一个用作委托的方法.代码将转换为:

CompilerGeneratedClass tmp = new CompilerGeneratedClass();
tmp.result = 0;
Action<int> tmpDelegate = new Action<int>(tmp.CompilerGeneratedMethod);
intList.ForEach(tmpDelegate);
Run Code Online (Sandbox Code Playgroud)

最重要的是还有的哲学之间的差异foreachForEach埃里克利珀已经写了.

就个人而言,我只是使用LINQ:

int result = intList.Sum();
Run Code Online (Sandbox Code Playgroud)

我怀疑性能差异实际上是实际代码中的瓶颈,但LINQ版本是最清晰的IMO,这总是一件好事.