Параллельное выполнение функции и разумное количество экземпляров - PullRequest
0 голосов
/ 28 мая 2018

У меня есть список объектов, и я должен сделать некоторые разработки для каждого из них, и все это за наименьшее возможное время.

Поскольку эти разработки независимы друг от друга, мы 'Мы решили сделать их параллельно с Parallel.ForEach.

Parallel.ForEach(hugeObjectList,
    new ParallelOptions { MaxDegreeOfParallelism = 50 },
    obj => DoSomeWork(obj)
);

Поскольку мне кажется неразумным устанавливать огромное число на ParallelOptions.MaxDegreeOfParallelism (например, 50 или 100), как мы можем найти оптимальное числопараллельная задача, чтобы сократить этот список?

Запускает ли Parallel.Foreach DoSomeWork на другом ядре?(итак, поскольку у нас 4 ядра, правильная степень параллелизма будет 4?)

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Запрос платформы должен приблизить вас к оптимальному (для работы с процессором).

new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount  },

Еще один очень хороший вариант - ничего не делать, т. Е.

//new ParallelOptions { MaxDegreeOfParallelism = 50 },

Edit

есть много io с базой данных ...

Это делает MaxDegreeOfParallelism = 1 еще одним очень хорошим кандидатом.Или, может быть, 2.

Что вы действительно должны изучить, так это асинхронные / ожидающие и асинхронные вызовы базы данных.Не Параллельный класс.

0 голосов
/ 28 мая 2018

Единственный способ узнать наверняка - проверить это.Большее количество потоков не означает лучшую производительность и часто может привести к худшей производительности.Некоторые мысли:

  1. Разработка алгоритма для одного потока, а затем добавление Parallel.For вокруг него бессмысленно.Вы должны изменить свой алгоритм, чтобы использовать преимущества нескольких потоков, иначе преимущества параллельной обработки будут незначительными или отрицательными.

  2. Если вы читаете с диска или загружаете данные по сетевому соединению, гдеСервер может кормить вас так же быстро, как вы получаете данные, вы можете обнаружить, что модель производитель / потребитель работает лучше всего.Если обработка требует больших вычислительных ресурсов, используйте много потоков пользователей (я склонен использовать Num Cores - 2. Один для пользовательского интерфейса, другой для производителя).Если это не дорого в вычислительном отношении, не имеет значения, сколько пользовательских потоков вы используете.

  3. Если вы загружаете данные из Интернета из различных источников, а серверам требуется время, чтобы ответитьВы должны запустить довольно много потоков (50-100 не сумасшедший).Это связано с тем, что потоки просто будут ждать ответа сервера.

0 голосов
/ 28 мая 2018

Я думаю, это говорит само за себя

По умолчанию For и ForEach будут использовать сколько угодно потоков, предоставляемых планировщиком, поэтому изменение MaxDegreeOfParallelism по умолчанию ограничивает только количество одновременных задач.

MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...