嵌套并行性能问题
本文关键字:问题 性能 并行性 并行 嵌套 | 更新日期: 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
调用以简化您的代码。