在性能水平上讲,更倾向于使用并且编译器工作更轻的选项,有任何重大差异吗?
List<int> intList;
foreach (int i in intList)
或者
intList.ForEach(i => result += i);
在性能水平上讲,更倾向于使用并且编译器工作更轻的选项,有任何重大差异吗?
List<int> intList;
foreach (int i in intList)
intList.ForEach(i => result += i);
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版本最清晰,这总是一件好事。