2012-07-02 28 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