Summary:我从 System.Threading.Tasks.Parallel.ForEach 和并发数据结构更改为简单的 plinq(并行 Linq)查询。速度是amazing.
那么 plinq 本质上比 Parallel.ForEach 更快吗?或者它是否特定于任务。
// Original Code
// concurrent dictionary to store results
var resultDict = new ConcurrentDictionary<string, MyResultType>();
Parallel.ForEach(items, item =>
{
resultDict.TryAdd(item.Name, PerformWork(source));
});
// new code
var results =
items
.AsParallel()
.Select(item => new { item.Name, queryResult = PerformWork(item) })
.ToDictionary(kv => kv.SourceName, kv => kv.queryResult);
Notes:
现在,每个任务 (PerformWork) 的运行时间在 0 到 200 毫秒之间。我以前花了更长的时间才优化它。这就是我首先使用 Tasks.Parallel 库的原因。因此,我将总时间从 2 秒缩短到约 100-200 毫秒,执行大致相同的工作,只是使用不同的方法。 (哇 linq 和 plinq 太棒了!)
问题:
- 使用 plinq 与 Parallel.ForEach 是否会加快速度?
- 是否只是简单地删除并发数据结构(ConcurrentDictionary)? (因为它不需要同步线程)。
- 基于此的答案相关问题 https://stackoverflow.com/questions/2138361/reactive-framework-vs-plinq-vs-task-parallel-library-vs-parallel-extensions
尽管 PLINQ 主要基于没有副作用的函数式编程风格,但副作用正是 TPL 的目的。如果您想要实际并行工作而不只是并行搜索/选择内容,则可以使用 TPL。
我是否可以假设因为我的模式基本上是功能性的(让输入产生新的输出而不发生突变),所以 plinq 是正确使用的技术?
我正在寻找我的假设是否正确的验证,或者是否有迹象表明我遗漏了某些内容。
不可能使用这两个代码示例来进行明确的比较Parallel.ForEach
和 PLINQ。代码示例实在是太不同了。
我首先想到的是第一个示例的使用ConcurrentDictionary
第二个用途Dictionary
。这两种类型具有截然不同的用途和性能特征。为了准确比较两种技术,您需要在此处保持类型一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)