【问题标题】:"foreach" VS "List<T>.Foreach"...which wins“foreach” VS “List<T>.Foreach”...哪个赢了
【发布时间】:2011-11-09 06:47:58
【问题描述】:

就编译器工作而言,哪个更倾向于使用并且更轻量级的性能级别,有什么主要区别?

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

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

【问题讨论】:

标签: c# performance generics compiler-construction foreach


【解决方案1】:

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

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

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

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

那么就生成的内容而言,第一种形式相当简单——你最终会得到一个局部变量、迭代列表的代码(使用List&lt;T&gt;.Enumerator)和将值添加到局部变量的 IL .

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

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

除此之外,foreachForEach 之间存在哲学差异,其中Eric Lippert has written about

我个人只是使​​用 LINQ:

int result = intList.Sum();

我怀疑性能差异实际上会成为实际代码中的瓶颈,但 LINQ 版本是最清晰的 IMO,这始终是件好事。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2015-11-19
    • 2010-10-19
    • 2011-06-29
    • 2010-10-12
    相关资源
    最近更新 更多