2011-07-14 28 views
3

這是更快哪個更快?循環對象屬性或linq查詢?

var query = from prop in object.GetType().GetProperties() 
      where prop.Name == "Id" 
      select prop; 

var singleProperty = query.SingleOrDefault(); 
//do stuff with singleProperty 

比這個?

var type = object.GetType(); 
foreach(var prop in type.GetProperties()) 
{ 
    if(prop.Name == "Id") 
    { 
    //do stuff 
    } 
} 

反過來呢?還是他們是一樣的?
爲什麼和如何知道?

對不起,我的問題過於直接。我更喜歡第一個,但我不知道爲什麼或者如果我應該。

謝謝。

回答

4

從技術上講,由於中間數據和LINQ抽象,第一種情況可能會分配更多的內存並執行更多的處理來生成比第二種情況更多的最終結果。但是時間和內存的大小在事物的宏觀範圍內是微不足道的,您最好讓代碼的可讀性最好,而不是最有效的這種情況。這可能是一個過早優化的例子。

這裏有一些參考爲什麼第一次可能會稍微慢一點:

  1. http://www.schnieds.com/2009/03/linq-vs-foreach-vs-for-loop-performance.html
  2. http://ox.no/posts/linq-vs-loop-a-performance-test
  3. http://geekswithblogs.net/BlackRabbitCoder/archive/2010/04/23/c-linq-vs-foreach---round-1.aspx
+0

但是,如果您不評估整個IEnumerable,它可以很好地處理更少的數據......例如,.ToList()可以完成此操作。 – dwerner

+0

有道理。我很好奇看看是否有其他意見。感謝您輸入mellamokb。 – trevorc

+0

@丹尼爾。如果您沒有評估,您將如何獲取房產的名稱和價值? – trevorc

1

正確的答案是:使用反射來看看真實被產生什麼編譯器。

也就是說,您的LINQ查詢使用相同的機制來檢索屬性列表作爲您的其他片段。技術上應該更快,而不涉及linq開銷。不過,我認爲這種差異很小(即不可感知),所以這實際上歸結爲代碼可讀性和可維護性決定。

我討厭LINQ,所以跳過它。

回顧,一年後

我發現LINQ是不是,我還以爲是惡魔。實際上,我對它的實現印象非常深刻,並且花了相當多的時間看着IL試圖找到一個不喜歡它的正當理由。這就是說:LINQ到對象很漂亮。但是,未來幾代人正在使用數據庫處理項目:不要將其用作在客戶端上執行所有查詢的原因,而不是讓數據庫服務器執行其非常擅長的操作。

+0

你爲什麼討厭LINQ? – mellamokb

+1

因爲使用類似於SQL的查詢混淆C#源代碼感覺像是糟糕的編碼。 –

+1

我想我對使用一堆相同結構化的for/foreach循環來簡化處理一組數據的方法感到相同。正如@Reddog所說的,對於他們自己:-) – mellamokb

0

它們在性能方面相同,因爲LINQ使用deferred execution。但是,一個普通的(和不相關的)更大的內存可能會進入LINQ選項。

因此,它們在性能和行爲上(實際上)是相同的!

爲了便於閱讀,我會使用LINQ版本,因爲我喜歡LINQ,但是對於他們自己。

+0

不挑選尼特,但如果一個解決方案需要更多的內存,它們不能具有相同的性能。分配/釋放,GC等都需要時間。 –

+0

還有一個事實,即foreach使用一個被操作的類來迭代數組。由於使用指針並調用函數,每次調用該迭代器類都會導致性能下降。常規循環通常是最快的。但是如果涉及到排序,linq有一些巧妙的技巧可以讓它更快。 – TamusJRoyce