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

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

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

我应该使用

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/

相关文章:

c# - 使用 LINQ 按类型合并序列

c# - LINQ 和 C# - 处理可能为空的参数

C# 编译器错误 : Cannot convert lambda expression

c - for 循环上的多个 pragma 指令(C 和 VS 2013)

python - python字典上使用的 'in'子句是否每次都调用keys()函数?

mysql - 为什么我的 UPDATE ... WHERE ... ORDER BY .. LIMIT 1 语句需要这么长时间?

C#:异步回调 - 回调方法的处理是否会阻塞应用程序?

c# - VS2017和Entity framework Core 2.0中自定义执行策略报错

c# - 在 LINQ 查询中使用来自反射的值

linq - 如何使用 QueryOver 过滤特定类?