Вложенный параллельный вопрос производительности - PullRequest
4 голосов
/ 11 июля 2011

У меня есть вопрос.

Есть ли преимущества использования Parallel.Invoke внутри другого 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);
                             }
                         });

Iу меня около 50 тыс. записей, а на моей машине 2 основных процессора, и вычисляя время вычислений, я получаю почти тот же результат.Итак, мой вопрос: есть ли какие-либо преимущества использования Parallel внутри Parallel?Какая лучшая практика для этого?

Большое спасибо.

С уважением, Влад.

Ответы [ 2 ]

5 голосов
/ 11 июля 2011

В этом случае вероятно никакой выгоды. может быть полезным в том случае, если у вас относительно мало «внешних» заданий, но потенциально много «внутренних» заданий.

С другой стороны, это также зависит от того, что делают эти три работы. Если это по существу асинхронные задачи (например, в базе данных), которые могут выполняться параллельно, то конечно ... но если это локальные задачи, интенсивно использующие ЦП, то, вероятно, вы просто собираетесь дать дополнительную работу планировщику без реальной выгоды.

Учитывая внешний вид вашего кода, мне кажется, что вы вполне могли бы выиграть от выполнения одного запроса (или, может быть, трех) и группировки по yearMonth хотя ...

4 голосов
/ 11 июля 2011

Поскольку параллелизм внешнего цикла уже поддерживает занятость ваших процессоров (50 тыс. Элементов), использование параллелизма в цикле дает мало преимуществ. В целях удобства чтения я бы удалил вызов Parallel.Invoke, чтобы упростить ваш код.

...