在所有Linq查询中尝试使用Plinq是否可以?

Ton*_*ich 16 c# linq .net-4.0 plinq task-parallel-library

我读到,如果发现PLinq更贵,PLinq将自动使用非并行Linq.所以我想为什么不将PLinq用于所有事情(如果可能的话)并让运行时决定使用哪一个.

应用程序将部署到多核服务器,我可以开发更多代码来处理并行性.

使用plinq作为默认值的缺陷是什么?

Nix*_*Nix 9

一个陷阱是你失去了利用套装排序的能力.

请使用以下代码:

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

您不能指望按顺序排列的结果,因此结果可能 是该集合的任何排列.这是最大的陷阱之一,从某种意义上讲,如果您处理有序数据,那么由于排序成本,您可能会失去性能优势.

另一个问题是你失去了捕获已知异常的能力.所以我无法捕获空指针异常(不是说你应该这样做)或者甚至捕获FormatException.

有很多理由说明为什么你不应该总是在所有情况下都使用Plinq,我将再强调一下.不要读到"自动使用非并行Linq",它只能处理查询简单的障碍情况,或者太复杂而无法并行运行.

始终记住,使用PLINQ越多,您将在服务器上消耗的资源就越多,而这些资源正在从其他正在运行的线程中消失.

资源:

MSDN PLNQ白皮书

Paul Kimmel在PLINQ上

  • 为了保证排序,您可以只使用AsOrdered(),但显然需要进行测量以确定您是否在算法中获得了任何内容,因为这会增加开销.就异常而言,如果在并行执行中发生任何事情,您将获得AggregateException,您可以从中获取通过InnerException*s*属性发生的各个异常.与每种技术一样,了解它是否会使您受益的唯一方法是使用代表您将在现实世界中处理的内容的数据集进行实际测量. (2认同)