我想知道如何以最有效的方式实现这一目标。
我应该使用
a.RemoveAll(x => b.AsParallel().Any(y => y == x));
或
a.AsParallel().Except(b.AsParallel());
还是别的?
谁能解释一下根本的区别是什么?在我看来,从测量来看,第二条线比较慢。这是什么原因?
最佳答案
使用第二个选项,有两个 ParallelQuery<T>
操作,将并行执行整个操作:
var results = a.AsParallel().Except(b.AsParallel());
第一个选项对删除进行顺序检查,并且必须构建 ParallelQuery<T>
对于每次迭代,这可能会慢得多。
然而,根据元素的数量,在没有 AsParallel
的情况下运行它实际上可能更快:
var results = a.Except(b);
在许多情况下,对较小的集合进行并行化的开销超过了 yield 。在这种情况下,了解的唯一方法是分析和衡量所涉及的选项。
It seems to me, from measuring, that the second line is slower. What is the reason for this?
这可能是由很多因素造成的。首先,确保您在发布版本中运行在 VS 主机之外(这是一个常见问题)。否则,这可能是由于集合的大小和涉及的数据类型。
关于c# - 如何有效地并行化 LINQ Except 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082490/