2010-05-23 67 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

相关问题