摘要:我从 System.Threading.Tasks.Parallel.ForEach 和并发数据结构更改为简单的 plinq (Parallel Linq) 查询。速度是惊人的。
那么 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);
注意:现在每个任务(PerformWork)的运行时间在 0 到 200 毫秒之间。在我优化它之前,它曾经需要更长的时间。这就是我首先使用 Tasks.Parallel 库的原因。所以我从 2 秒的总时间到 ~100-200 毫秒的总时间,执行大致相同的工作,只是使用不同的方法。(哇 linq 和 plinq 太棒了!)
问题:
- 使用 plinq 与 Parallel.ForEach 是否加快了速度?
- 是不是简单地删除了并发数据结构(ConcurrentDictionary)?(因为它不需要同步线程)。
- 根据这个相关问题的答案
尽管 PLINQ 主要基于没有副作用的函数式编程风格,但副作用正是 TPL 的用途。如果您想实际并行工作而不是并行搜索/选择事物,则使用 TPL。
我可以假设因为我的模式基本上是功能性的(给输入产生没有突变的新输出),那么 plinq 是正确使用的技术吗?
我正在寻找我的假设是否正确的验证,或者是我遗漏了什么的迹象。