Вложенные пары Parallel.ForEach

У меня есть код, который я сейчас оптимизирую для concurrency в многоядерных архитектурах. В одном из моих классов я нашел вложенный цикл foreach. В основном внешний цикл повторяется через массив объектов NetworkInterface. Внутренний цикл повторяется, хотя сетевые интерфейсы IP-адресов.

Это заставило меня задуматься, есть ли вложенные Parallel.ForEach петли обязательно хорошая идея? После прочтения этой статьи (Nested Parallel.ForEach Loops в том же списке?) Я до сих пор не знаю, что применимо в отношении эффективности и параллельного дизайна. В этом примере используются инструкции Parallel.ForEach, применяемые к списку, в котором обе петли выполняют операции в этом списке.

В моем примере циклы выполняют разные вещи, поэтому, если я:

  • Использовать вложенные петли Parallel.ForEach?
  • Пользователь Parallel.ForEach в родительском цикле и оставьте внутренний цикл as-is?

Ответ 1

Параллельный .ForEach не обязательно выполняется параллельно - это просто запрос сделать это, если это возможно. Поэтому, если среда выполнения не имеет мощности ЦПУ для параллельного выполнения циклов, она не будет делать этого.

Если действия на циклах не связаны (т.е. если они являются отдельными и не влияют друг на друга), я не вижу проблем с использованием Parallel.ForEach как на внутренней, так и на внешней петлях.

Это действительно зависит от среды исполнения. Вы можете выполнить временные тесты, если ваша тестовая среда достаточно похожа на производственную среду, а затем определите, что делать. Если у вас есть сомнения, проверьте; -)

Удачи!

Ответ 2

Ответ будет, это зависит;

  • Что вы делаете с IP-адресом, когда он у вас есть?
  • Сколько времени занимает каждый шаг?

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

Используйте StopWatch, чтобы помочь вам ответить на эти вопросы.