c# - 嵌套并行性能问题

标签 c# .net multithreading parallel-processing task-parallel-library

我有问题。

在另一个 Parallel.ForEach 中使用 Parallel.Invoke 有什么好处吗?

这是我的代码:

    Parallel.ForEach(yearMonths,
                     () => new List<DJVSStatsCo>(),
                     (yearMonth, loopState, localDjvsStatsCo) =>
                         {
                             var coVintageCounter = 0;
                             var coExitsCounter = 0;
                             var coExtant = 0;

                             Parallel.Invoke(() =>
                                             coVintageCounter = globalData.ValuationEventsPit.
                                                                    Where(x => x.FirstRoundYearMonth <= yearMonth).
                                                                    Select(x => x.CompanyId).Distinct().Count(),
                                             () =>
                                             coExitsCounter = globalData.ValuationEventsPit.
                                                                  Where(x => x.ExitDate != null && x.ExitDateYearMonth == yearMonth).
                                                                  Select(x => x.CompanyId).Distinct().Count(),
                                             () =>
                                             coExtant = globalData.ValuationEventsPit.
                                                            Where(x => x.FirstRoundYearMonth <= yearMonth && (x.ExitDate == null || x.ExitDateYearMonth > yearMonth)).
                                                            Select(x => x.CompanyId).Distinct().Count()
                                 );

                             localDjvsStatsCo.Add(new DJVSStatsCo(yearMonth, coVintageCounter, coExtant, coExitsCounter));

                             return localDjvsStatsCo;
                         },
                     x =>
                         {
                             lock (locker)
                             {
                                 djvsStatsCos.AddRange(x);
                             }
                         });

我有大约 50K 条记录,我的机器有 2 个核心处理器,计算计算时间我得到几乎相同的结果。所以我的问题是在 Parallel 内部使用 Parallel 有什么好处吗?这方面的最佳做法是什么?

非常感谢。

真诚的, 弗拉德。

最佳答案

在这种情况下,可能没有任何好处。如果您的“外部”工作相对较少,但“内部”工作可能很多,那么可能会有所帮助。

另一方面,这也取决于这三个工作是做什么的。如果它们本质上是可以并行执行的异步任务(例如在数据库上),那么当然......但是如果它们是本地 CPU 密集型任务,那么你可能只是去为调度程序提供额外的工作而没有真正的好处。

鉴于您的代码外观,令我印象深刻的是您很可能会从执行单个查询(或可能三个)并按 yearMonth 分组中获益,尽管...

关于c# - 嵌套并行性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6650679/

相关文章:

.net - 如何从 android 调用 .NET Web 服务?

c# - 在我的计算机上将图像保存为 HTML 以嵌入电子邮件?

c# - 关于 var 关键字用法的问题

c# - httpwebrequest getresponse() 不返回任何内容,而 fiddler 显示内容

c# - 刚体在 Unity 中相互进入

c++ - 如何根据固定的循环频率正确协调线程?

java - 线程安全方法内的线程不安全对象

c# - 在这两种链式扩展方法中,是否有理由优先使用其中一种?

c# - 从 TFS 打开文件会出现错误 TF10187

python:使用队列将字典传递给另一个线程