PLinq 本质上比 System.Threading.Tasks.Parallel.ForEach 更快

2024-01-07

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 太棒了!)

问题:

  1. 使用 plinq 与 Parallel.ForEach 是否会加快速度?
  2. 是否只是简单地删除并发数据结构(ConcurrentDictionary)? (因为它不需要同步线程)。
  3. 基于此的答案相关问题 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(使用前将#替换为@)

PLinq 本质上比 System.Threading.Tasks.Parallel.ForEach 更快 的相关文章

随机推荐