【问题标题】:Is it OK to try to use Plinq in all Linq queries?尝试在所有 Linq 查询中使用 Plinq 是否可以?
【发布时间】:2011-02-23 00:45:57
【问题描述】:

我读到如果 PLinq 发现 PLinq 更昂贵,它会自动使用非并行 Linq。所以我想为什么不对所有事情都使用 PLinq(如果可能),让运行时决定使用哪一个。

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

默认使用 plinq 有哪些缺陷?

【问题讨论】:

    标签: c# linq .net-4.0 task-parallel-library plinq


    【解决方案1】:

    一个坑是你失去了利用集合排序的能力。

    取以下代码:

    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

    【讨论】:

    • 为了保证排序,你可以只使用 AsOrdered() 虽然你显然需要测量你是否在你的算法中获得任何东西,因为这确实增加了开销。至于异常,如果在并行执行中发生任何事情,您将获得 AggregateException,您可以从中获取通过 InnerExceptions 属性发生的各个异常。与每项技术一样,了解它是否对您有益的唯一方法是使用代表您将在现实世界中处理的数据集进行实际测量。
    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多