嵌套并行性能问题

Vla*_*den 4 .net c# parallel-processing multithreading 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);
                             }
                         });
Run Code Online (Sandbox Code Playgroud)

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

非常感谢.

弗拉德.

Jon*_*eet 5

在这种情况下,可能没有任何好处.有可能是的情况下的好处,你有相对较少的"外"的工作,但许多潜在的"内"的工作.

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

考虑到你的代码外观,我觉得你很可能从执行单个查询(或者可能是三个)中受益,然后通过分组yearMonth...