2009-06-10 200 views
2

當您在某些類型(即自定義集合)中使用某些枚舉方法時,最好是使用LINQ語法還是僅使用舊式枚舉(for/foreach)?LINQ vs常規枚舉

使用.NET 3.5是給定的。

我問這是爲了獲得最大的性能和可讀性。該應用程序也被設計爲並行。

你會喜歡哪一個?

回答

3

如果您絕對必須扭虧爲盈,那麼一個for/foreach循環很難提高效率。但是,如果您要追求平行性和可讀性,那麼在我的書中,Enumerable<T>擴展方法和LINQ獲勝。

+1

謝謝,與平原LINQ我會得到並行執行?或者你的意思是PLINQ? – 2009-06-10 17:38:55

+0

你必須爲我們PLINQ。 – mfawzymkh 2009-06-12 07:41:58

6

LINQ查詢可以很容易地使用PLinq(內置於.NET 4)

我個人的LINQ更容易閱讀被並行化,但它取決於你作爲一個開發商。

foreach (var item in collection) 
{ 
    if (item.Value == SomeOtherValue) 
     performSomeProcessing(); 
} 

VS

foreach(var item in collection.Where(a => a.Value == SomeOtherValue)) 
{ 
    performSomeProcessing(); 
} 

我認爲(雖然我沒有親自這個基準測試),編譯器優化出小函數調用,所以性能不應該是noticably不同。

2

我幾乎總是喜歡在我的集合中使用LINQ而不是標準循環結構,但並行化方面稍微改變了一些事情。

如果您打算使用.NET 4.0,並行結構(特別是使用Parallel.For)將在並行化方面擊敗PLINQ,只要您事先知道計數。 PLINQ中的分區器做得很好,但是它們的用途非常普遍,並且如果事先已知計數,則無法與可用的分區策略相匹配。這會使Parallel.For當它可用時勝過PLINQ。

+0

謝謝里德。我不知道Parallel.For當你知道伯爵時更好。怎麼樣Parallel.Foreach(不知道是否有一個)。 – 2009-06-10 19:08:51

2

LINQ to Objects性能是一件混雜的事情。由於它涉及大量的間接調用(每個lambda都是一個),它有時會比較慢,有時(當lambda捕獲並使用外部作用域的變量時)是它的3-4倍。而且,不,編譯器(不論是C#還是JIT)都不會優化它 - 它不能內聯虛擬方法調用,這就是通過代理有效調用的內容。所以如果你嚴格要求表現的話,在任何情況下,foreach都會略微更快。

PLINQ可以緩解這種差異,但請注意,懲罰足夠重要,您可能需要4個內核才能與之匹配。另一方面,它會隨着內核數量的增加而增加,而普通的內存不會。

2

這取決於 - 您的迭代是否有副作用?如果是這樣,我會避免使用任何形式的LINQ,否則使用LINQ和PLINQ來說明它的簡單聲明性質。