TPL - 是默认排序的PLINQ查询吗?

时间:2011-06-22 18:43:46

标签: .net-4.0 task-parallel-library

在一些播客中我听了PLINQ的讨论,最初的想法是默认提供无序查询,因为出于性能原因,如果重要的话,开发人员可以决定让它排序。但后来有人说,这将被改为默认订购,那些希望获得额外业绩并且不关心订单的开发人员可以使其无序化。

我见过的所有示例和文档都使用.AsOrdered(),这让我相信它默认无序。

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:1)

默认情况下它们是绝对无序的,这正是AsOrdered存在的原因。使用AsOrdered引入了一个额外的步骤,因而带来额外的开销,从不同的工作线程中获取结果并使它们按正确顺序排列。此外,如果不明显,AsOrdered正在阻止(请参阅下面的更新),这意味着在项目按原始开始的顺序到达之前,结果将无法通过PLINQ查询管道进行。

最后,请注意AsUnordered存在,以便您可以在查询管道中从该点开始将查询切换回非有序查询。

<强>更新

我只是想通过“阻止”澄清我的意思。会发生什么是PLINQ必须在将它们交给ParallelQuery时观察元素的原始顺序。从那里,它将确保在元素乱序之前完成的元素缓冲。因此,如果在“one”之前按顺序排列元素,如“one”,“two”,“three”和“two”,则“two”将被缓冲,直到“one”完成。

答案 1 :(得分:1)

除非您指定AsOrdered,否则PLINQ不会对您的结果进行排序。由于Parallel LINQ将同时执行工作,它可能会在第一项之前完成第二项。

假设您有一个类似于以下的课程:

public class Foo
{
    public int Bar() {return something;}
}

假设在Bar的不同实例上Foo需要不确定的时间来完成,因为它会检查文件。所以说我们有一个案例,其中项目A的Bar需要10秒才能完成,但是项目B需要1个。因为B先完成,所以最终结束。

.NET默认不会对它进行排序,因为它需要按顺序完成项目才能继续下一个项目。你不能订购你不知道的东西。因此,出于性能原因,默认情况下它们是无序的。 AsOrdered表示订单很重要,但代价是阻止。