此代码之间有什么区别:
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();
答案 0 :(得分:5)
对AsParallel
的调用之后的所有将被并行化。
因此,在您的第一个列表中,只有ToList
操作将并行化为第二个代码示例中的位置,整个查询将被并行化。
答案 1 :(得分:3)
让我们回去.....
在线程之间划分工作有两种策略:数据并行和 任务并行。
您位于: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(....)....