LINQ to objects vs for each - 执行时间的差异

时间:2009-10-22 05:42:04

标签: linq linq-to-objects

我正在为每个循环

foreach (Account acct in acctTest)
            {
                if (acct.AccountId == acctId)
                {
                    foreach (Customer cust in acct.CustomerColl)
                    {
                        if (cust.CustomerId == custId)
                        {
                            customerName = cust.CustomerName;
                            break;
                        }
                    }
                }
            }

Linq查询做类似的事情(认为这可以改进)

customerName = (from acct in acctTest
                           where acct.AccountId == acctId
                           from cust in acct.CustomerColl
                           where cust.CustomerId == custId
                            select cust.CustomerName).ToString() ;

我在1000次循环中执行上述两次5次,得到如下的执行时序。

每个人的经历时间::: 7377
Linq2经历的时间::: 15653
每个人的经历时间::: 1576年 Linq2经历的时间::: 1718
每个人的经历时间::: 1569年 Linq2经过的时间::: 1726
每个人的经历时间::: 1569年 Linq2经历的时间::: 5583
每个人的经历时间::: 1570年 Linq2经历的时间::: 1506

为什么执行时间存在差异和不一致? 另外,有没有一种方法可以重写LINQ查询以获得更好的性能?

4 个答案:

答案 0 :(得分:2)

(from acct in acctTest
where acct.AccountId == acctID
select acct.CustomerColl)
  .Where(c => c.CustomerId == custId)
  .Select(cn => cn.CustomerName)
  .FirstOrDefault()

答案 1 :(得分:1)

第四次执行看起来像Linq方面的垃圾收集。

除此之外,LINQ不知道您只是尝试获取客户名称的单个实例。它不知道CustomId或AccountId是唯一的关系,这是您的代码所假设的。简而言之,代码不是类似的:)

此外,在第一个示例中,您可能需要检查外部循环,如果custerName!= NULL,那么您可以停止短路;)

答案 2 :(得分:1)

显而易见的是,查看上面的代码是 - 如果是foreach,则在为customerID找到 a 匹配时停止内循环执行。

然而,LINQ似乎并非如此。

foreach和LINQ查询的输出是否相同?
如有人在这里建议的那样使用JOIN并使用FirstOrDefault怎么样?

答案 3 :(得分:0)

您是否已将LINQ的使用标识为应用程序中的瓶颈?如果没有,你不太可能在传统的foreach和lambdas之间追逐微秒正在燃烧你的宝贵时间而没有真正的好处。与在所有LINQ表达式组合中相比,您可能会花费更多时间在一个数据库调用或I / O操作上。相反,担心这些。