我有问题。
在另一个 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/