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)
最重要的是还有的哲学之间的差异foreach和ForEach其埃里克利珀已经写了.
就个人而言,我只是使用LINQ:
int result = intList.Sum();
Run Code Online (Sandbox Code Playgroud)
我怀疑性能差异实际上是实际代码中的瓶颈,但LINQ版本是最清晰的IMO,这总是一件好事.