Многопоточные циклы C # 4.0: когда использовать, когда не использовать? - PullRequest
1 голос
/ 22 февраля 2012

Я пытаюсь найти, что является хорошей мерой для использования C # 4.0 резьбового цикла. Скажем, у меня сейчас два массива, многомерных, ширина / высота 8/5, то есть по 40 элементов в каждом.

Через фрагмент кода, который я сейчас оптимизирую, я сталкиваюсь с такими ситуациями несколько раз, когда я просто умножаю элемент на элемент таких двух таблиц (используя вложенный цикл)

Стоит ли использовать для этой цели резьбовую петлю 4.0? если нет, то каков пример хорошей практики / размера для его использования или нет?

С уважением,

1 Ответ

5 голосов
/ 22 февраля 2012

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

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

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

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

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