【问题标题】:Nested Parallel performance question嵌套并行性能问题
【发布时间】:2011-07-11 13:19:10
【问题描述】:

我有问题。

在另一个 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 有什么好处吗?这方面的最佳做法是什么?

非常感谢。

真诚地, 弗拉德。

【问题讨论】:

  • 如果您在两种情况下都获得相同的吞吐量,那么没有理由使用Parallel.Invoke 使代码复杂化。换句话说,如果 less 并行已经使 CPU 饱和,你不会因为使 more 并行而获得奖励积分......有时你甚至会失去积分!

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


【解决方案1】:

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

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

鉴于您的代码外观,让我感到震惊的是,您很可能会从执行单个查询(或者可能三个)并按 yearMonth 分组中受益...

【讨论】:

    【解决方案2】:

    由于外循环的并行性已经让您的 CPU 处于忙碌状态(50k 个元素),因此在循环内引入并行性并没有什么好处。为了便于阅读,我将删除 Parallel.Invoke 调用以简化您的代码。

    【讨论】:

    • 假设子任务是纯计算的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多