嵌套并行性能问题

本文关键字:问题 性能 并行性 并行 嵌套 | 更新日期: 2023-09-27 18:01:40

我有个问题。

使用Parallel有什么好处吗?调用另一个Parallel.ForEach?

下面是我的代码:
    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分组中受益…

由于外部循环的并行性已经使cpu繁忙(50k个元素),因此在循环中引入并行性几乎没有什么好处。出于可读性的考虑,我将删除Parallel.Invoke调用以简化您的代码。