Linq效率问题 - foreach与聚合

时间:2009-08-12 16:55:25

标签: linq performance aggregate

哪个更有效?

//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基本上会列出名单吗?所以,如果我四次打电话给Sum,是不是列举了四次列表呢?只做一个foreach不是更有效,所以我只需要列举一次列表吗?

2 个答案:

答案 0 :(得分: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对您的计时产生太大的影响。

答案 1 :(得分:2)

我继续对此进行了描述并发现你是对的。

每个Sum()有效地创建自己的循环。在我的模拟中,我将SQL数据集与20319条记录相加,每条记录有3个可求和的字段,发现创建自己的循环有2倍的优势。

我原本希望LINQ能够优化这一点并将整个负担推到SQL服务器上,但除非我将sum请求移动到初始LINQ语句中,否则它会一次执行一个请求。