2012-07-02 24 views
4

可能重复:
Should LINQ be avoided because it's slow?LINQ比简单循环慢多少?

我爱LINQ。正如我今天在另一篇帖子中看到的“这是自切片面包以来最好的事情”,我完全同意。但在我工作的公司里,其他人似乎都讨厌LINQ。

几个星期前,我第一次使用ReSharper,当我编码时,ReSharper突然告诉我,我的foreach循环可以转换成LINQ表达式。这对我来说很神奇,我向同事展示了。非常感谢我的惊喜,他说:“我希望它可以反过来将LINQ变成循环。那会更快!“

那么LINQ-to-Objects真的很慢吗?我尝试过自己。 当我运行下面的示例几次我得到已发生滴答周围350

 Stopwatch sw = new Stopwatch(); 

     List<Person> personList = new List<Person>(); 
     for (int i = 0; i < 5000; i++) 
     { 
      Person p = new Person() {ID = i}; 
      personList.Add(p); 
     } 

     sw.Start(); 

     Person searchPerson = null; 

     foreach (Person person in personList) 
     { 
      if (person.ID == 4321) 
      { 
       searchPerson = person; 
       break; 
      } 
     } 

     sw.Stop(); 

     Console.WriteLine(sw.ElapsedTicks); 

如果我改变循环的LINQ查询(ReSharper的将这样做对我来说)我绕过900 ElapsedTicks不止是循环的两倍。

Person searchPerson = personList.FirstOrDefault(person => person.ID == 4321); 

因为看起来LINQ确实比较慢,如果你使用它很多,这可能是一个问题。而在我们公司,我们有很多数据。那么避免LINQ是正确的决定还是我们做错了什么?

+0

p.s.通常,在进行基准测试时,您需要多次执行测试并对时间进行平均以获得结果。一次迭代是不够的。 –

回答

8

是的,速度较慢。然而,该延迟的一部分是一次初始化延迟,而不是每次迭代延迟。在100k迭代循环中,百分比差异比较低。

需要注意的一点是开发人员的时间为显着比代码中的性能损失要小得多,除非客户打电话抱怨性能问题。编写可读和可维护的代码比微优化你的代码更重要。

正如Eric Lippert所说的那么完美,LINQ should only be avoided if it's not fast enough

+0

链接已损坏。 – liang

+0

它没有损坏,由于被删除的状态,它仅限于10k +代表用户。由于一群人投票拒绝删除,现在又回来了。 – Polynomial

+0

你提到的一次初始化延迟是什么?从我读过[这里](http://stackoverflow.com/a/12820080/1057791)linq有点慢的原因是因为对枚举器的额外函数调用以及谓词和额外的对象分配,以及每次迭代都会发生? – BornToCode