PLINQ和AsParallel()

时间:2014-08-10 09:35:06

标签: c# plinq

此代码之间有什么区别:

int[] tab = new int[] { 1, 2, 3, 4, 5 };

List<int> result1 = (from t in tab
                     where t > 2
                     select t).AsParallel().ToList();

和此:

List<int> result2  = (from t in tab.AsParallel()
                      where t > 2
                      select t).ToList();

2 个答案:

答案 0 :(得分:5)

AsParallel的调用之后的所有将被并行化。

因此,在您的第一个列表中,只有ToList操作将并行化为第二个代码示例中的位置,整个查询将被并行化。

答案 1 :(得分:3)

让我们回去.....

enter image description here

在线程之间划分工作有两种策略:数据并行和 任务并行。

您位于:structured data parallelism区域。 (在plinq)

所以我们处理的 DATA 应该分为线程。

你的第一个代码毫无意义。

查看AsParallel的语法:

public static ParallelQuery AsParallel(
    this IEnumerable source
)

AsParallel应该应用于IEnumerable。 (就像在你的两个例子中......但是 - )

这里的重点是将工作划分为线程。

这将DATA分配给执行SAME操作的线程。

在第二个代码中,您将DATA分配给将执行相同操作的线程。 (因此你会获得更好的表现)

但是在第一个代码中,整个“make cores hot operation”是在单线程中完成的。 (where clause...) - 所以你错过了整点

注意 - 如果符合以下条件,那将是值得的:

...(from t in tab
    where t > 2
    select t).AsParallel().where(....)....