2010-05-23 77 views
16

我讀過PLinq會自動使用非並行Linq,如果它發現PLinq更昂貴。所以我想,爲什麼不使用PLinq來處理所有事情(如果可能),並讓運行時決定使用哪一個。可以嘗試在所有Linq查詢中使用Plinq嗎?

這些應用程序將部署到多核服務器,我可以開發更多的代碼來處理並行性。

使用plinq作爲默認的缺陷是什麼?

回答

9

一次下降是你失去了利用集合排序的能力。

看看下面的代碼:

var results = new int { 0 ,1 ,2 ,3 }; 
var doSomethingSpecial = (from r in results.AsParallel() select r/2).ToArray(); 

你不能對結果以便今後這樣的結果可能是集合所有排列數。這是最大的陷阱之一,從某種意義上說,如果您正在處理有序數據,那麼由於排序成本,您可能會失去性能優勢。

另一個問題是你失去了捕獲已知異常的能力。所以我無法捕捉一個空指針異常(並不是說你應該這樣做)或者甚至捕獲一個FormatException。

有很多理由,爲什麼你不應該總是在所有情況下使用Plinq,我將突出一個。不要太讀「自動使用非並行Linq」,它只能處理查詢簡單或難以並行運行的屏障情況。

請務必記住,越多使用PLINQ,您在服務器上消耗的資源越多,這些資源將從其他正在運行的線程中分離出來。

資源:

MSDN PLNQ white paper

Paul Kimmel on PLINQ

+2

爲了保證訂購你可以AsOrdered()但你顯然需要測量發現,如果你在你的算法獲得任何事情,因爲這確實增加高架。就異常而言,如果在並行執行中發生任何事情,您將從中獲得通過InnerException * s *屬性發生的單個異常,您將收到AggregateException。就像每一項技術一樣,要知道它是否會使您受益,唯一的方法就是使用代表您在現實世界中處理的數據集來實際測量。 – 2010-05-29 03:04:02

相關問題