2011-11-09 7 views
4

パフォーマンスレベルで話す方が、コンパイル作業の点でより軽く、大きな違いがありますか?"foreach" VS "List <T> .Foreach" ... which wins

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

または

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

あなたの結果は何であったか、それを測定すると? –

+0

あなた自身をチェックしようとしましたか?パフォーマンステストコードを知っていますか? – Amy

+0

可能な複製[.Net - リストがあるとき .ForEachは標準のforeachループよりも優先されますか?](http://stackoverflow.com/questions/1172977/net-when-is-listt-foreach-prefered-over-a) -standard-foreach-loop) –

答えて

10

TL; DRは:ここでのパフォーマンスの違いは、実際のアプリケーションではほぼ確実に軽微であり、かつ、とにかく同じ結果を達成するための、より読みやすい方法があります。しかし、まだコンパイルされたコードの違いを見るのは面白いです。完全なコードを想定し

が実際にある:

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

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

その後、最初のフォームが生成されますものに関してかなり簡単です - あなただけのローカル変数になってしまいます(List<T>.Enumeratorを使用して)リストを反復するコードと、ローカル変数に値を追加するIL

第2の形式では、resultのインスタンス変数とデリゲートとして使用するメソッドを持つ新しいクラスを生成する必要があります。 foreachEric Lippert has written aboutForEach哲学的違いがありますその上で

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

:コードはに変換されます。

個人的に私はちょうどかかわらず、LINQを使用したい:

int result = intList.Sum(); 

を私はパフォーマンスの違いが実際は、実際のコードのボトルネックになりますが、LINQのバージョンがIMO最も明確であり、それは常にだと疑います良いこと。

1

this benchmarkを参照。あなたの例では、List<int>.ForEach()が実際に一貫してより高速になると考えられます。

1

あなたはそれがこのように一つ一つにかかる時間を測定することができます

Stopwatch stopWatch = new Stopwatch(); 
stopWatch.Start(); 

「ここにコードを」

stopWatch.Stop(); 
Console.WriteLine(stopWatch.Elapsed.ToString());