Задача Parallel.For Parallel.ForEach Балансировка нагрузки, разделение на .Net - PullRequest
3 голосов
/ 13 января 2012

Делают ли параллельные методы Parallel.For и Parallel.ForEach,

внутренне свои собственные балансировку нагрузки и разбиение для лучшей производительности?

Если да и какие обстоятельства вы хотите записать, то создайтеваши собственные разделы, использующие класс Partitioner для повышения производительности?

1 Ответ

4 голосов
/ 13 января 2012

Процедуры обеспечивали свое собственное разделение.

Они основаны на "типичных" сценариях, но иногда могут требовать руководства, особенно в необычных ситуациях.

Например, разделение по умолчаниюРеализации IEnumerable<T> (которые не реализуют IList<T>) будут начинаться с небольшой группы для каждой задачи и медленно увеличиваться в размере.Однако, если вы знаете, что ваш IEnumerable<T> будет медленно кормить по одному элементу за раз, это вызовет блокировку, так как класс Parallel будет "ждать" следующего элемента, пока не получит достаточно элементов для раздела и расписаний.it.

Предоставляя свой собственный разделитель, вы можете предотвратить это и повысить пропускную способность.

Еще один отличный пример того, как помогает пользовательский разделитель, - если у вас очень мало работы за циклвещь.В этом случае разделение себя и работа над разделом позволяет избежать ненужных накладных расходов.Это описано на странице Как: ускорить работу небольших петлевых тел на MSDN.

...