2009-08-12 51 views
3

哪種效率更高?Linq效率問題 - foreach vs aggregates

//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將基本列舉在列表上嗎?所以如果我四次打電話給總結,是不是列舉了四次列表?改用foreach會不會更有效率,所以我只需要枚舉一次列表?

+0

我運行了Lasse建議的測試,發現有一個foreach循環而不是多個Sum可以大大提高效率。感謝Lasse並感謝Duck進行測試並提供進一步的支持。 – Alex 2009-08-12 17:27:31

回答

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()有效地創建它自己的循環。在我的模擬中,我將它與SQL數據集合成了20319條記錄,每條記錄有3個可加總字段,並發現創建自己的循環具有2X優勢。

我希望LINQ能夠優化這一點,並推動SQL服務器的所有負擔,但除非我將總和請求移動到最初的LINQ語句中,否則它會一次執行一個請求。