gpt4 book ai didi

c# - PLinq 本质上比 System.Threading.Tasks.Parallel.ForEach 快吗

转载 作者:太空狗 更新时间:2023-10-29 20:25:36 26 4
gpt4 key购买 nike

总结:我从 System.Threading.Tasks.Parallel.ForEach 和并发数据结构更改为简单的 plinq(并行 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 真棒!)

问题:

  1. 与 Parallel.ForEach 相比,使用 plinq 是否提高了速度?
  2. 是否只是简单地删除并发数据结构 (ConcurrentDictionary)? (因为它不需要同步线程)。
  3. 基于这个 related question 的答案

Whereas PLINQ is largely based on a functional style of programming with no side-effects, side-effects are precisely what the TPL is for. If you want to actually do work in parallel as opposed to just searching/selecting things in parallel, you use the TPL.

我可以假设因为我的模式基本上是功能性的(给输入产生新的输出而不改变),plinq 是正确的技术使用吗?

我正在寻找验证我的假设是否正确的证据,或者是否有迹象表明我遗漏了什么。

最佳答案

不可能使用这 2 个代码示例在 Parallel.ForEach 和 PLINQ 之间进行明确的比较。代码示例简直太不同了。

第一个让我印象深刻的是第一个示例使用 ConcurrentDictionary,第二个使用 Dictionary。这两种类型具有非常不同的用途和性能特征。为了准确比较这两种技术,您需要在此处与类型保持一致。

关于c# - PLinq 本质上比 System.Threading.Tasks.Parallel.ForEach 快吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5196293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com