如何有效地并行化LINQ Except方法

时间:2014-02-27 22:58:20

标签: c# linq optimization task-parallel-library parallel-extensions

我想知道如何以最有效的方式实现这一目标。

我应该使用

a.RemoveAll(x => b.AsParallel().Any(y => y == x));

a.AsParallel().Except(b.AsParallel());

或其他什么?

任何人都可以解释底层差异是什么吗?在我看来,从测量来看,第二条线路较慢。这是什么原因?

1 个答案:

答案 0 :(得分:4)

使用第二个选项,通过两个ParallelQuery<T>操作,将并行执行整个操作:

var results = a.AsParallel().Except(b.AsParallel());

第一个选项会对删除执行顺序检查,并且必须为每次迭代构建ParallelQuery<T>,这可能会慢得多。

但是,根据元素的数量,在没有AsParallel的情况下运行它可能会更快:

var results = a.Except(b);

在许多情况下,较小集合的并行化开销超过了收益。在这种情况下,唯一知道的方法是分析和衡量所涉及的选项。

  

在我看来,从测量来看,第二条线路较慢。这是什么原因?

这可能是由于很多因素造成的。首先,确保您在发布版本中运行VS主机之外(这是一个常见问题)。否则,这可能是由于集合的大小和涉及的数据类型。