2009-08-12 14 views
3

どれが効率的ですか?Linq効率の問題 - foreach vs集約

//Option 1 
foreach (var q in baseQuery) 
{ 
    m_TotalCashDeposit += q.deposit.Cash 
    m_TotalCheckDeposit += q.deposit.Check 
    m_TotalCashWithdrawal += q.withdraw.Cash 
    m_TotalCheckWithdrawal += q.withdraw.Check 
} 

//Option 2 
m_TotalCashDeposit = baseQuery.Sum(q => q.deposit.Cash); 
m_TotalCheckDeposit = baseQuery.Sum(q => q.deposit.Check); 
m_TotalCashWithdrawal = baseQuery.Sum(q => q.withdraw.Cash); 
m_TotalCheckWithdrawal = baseQuery.Sum(q => q.withdraw.Check); 

私が求めていることは、Sumを基本的にリストの上に列挙することです。だから私が合計を4回呼び出すと、そのリストの4倍を列挙しているのではないでしょうか?代わりにforeachを実行するほうが効率的ではないので、リストを一度列挙すればよいのですか?

+0

Lasseが示唆したテストを実行し、複数の合計ではなくforeachループを1つ持つことは、かなりの量で効率が良いことを発見しました。テストを実行し、さらなるサポートを提供してくれてありがとうLasseと感謝のダック。 – Alex

答えて

5

それは、場合によってはそれに左右されるかもしれません。

知るべき唯一の確実な方法は、実際に測定することです。

それを測定するための簡単なコード:

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
// your code here 
sw.Stop(); 
Debug.WriteLine("Time taken: " + sw.ElapsedMilliseconds + " ms"); 
sw.Reset(); // in case you have more code below that reuses sw 

あなたのタイミングにあまりにも大きな効果を持つJITtingを避けるために、コードを複数回実行する必要があります。

2

私は先に進み、これをプロファイルし、あなたが正しいことを発見しました。

各Sum()は効果的に独自のループを作成します。私のシミュレーションでは、20319レコードのSQLデータセットを合計しました。各フィールドには3つの合計フィールドがあり、独自のループを作成すると2倍の利点があることがわかりました。

私は、LINQがこれを最適化してSQLサーバー全体の負荷を押し上げることを望んでいましたが、最初のLINQステートメントに合計リクエストを移動しない限り、各リクエストを1つずつ実行します。