Потенциальное преимущество async и Parallel.ForEach для операций ввода-вывода - PullRequest
0 голосов
/ 15 ноября 2011

Я разрабатываю и поддерживаю инструмент .NET 3.5 на работе, и мне интересно, можно ли получить потенциальный выигрыш в производительности с помощью нового TPL .NET 4 или даже новых асинхронных функций, которые все еще находятся в CTP.

Работу инструмента можно приблизительно описать следующим образом:

  1. Получить список файлов-контейнеров (в настоящее время .MSI-файлов) - несколько десятков из них, ~ 50-70
  2. Выполните итерацию по каждому файлу и создайте объект времени выполнения, представляющий его.
  3. Для каждого созданного объекта среды выполнения выполните несколько запросов к его содержимому (сравните его содержимое с некоторыми файлами в системе).

Пункты № 2 и № 3 - длинные, и я хотел бы получить некоторые мнения о потенциале улучшения времени выполнения (которое сейчас составляет несколько минут) с использованием Parallel.ForEach или других методов для выполнения этой работы.Параллельно.

Потенциальные улучшения, которые я ожидаю:

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

Не могли бы вы подумать, что это приложение может быть полезным, прежде чем приступить к разработке?

Ответы [ 3 ]

3 голосов
/ 15 ноября 2011

Я бы запустил профилировщик, чтобы увидеть, где ваше приложение тратит время, а затем решил бы.Если вы обнаружите, что он ожидает завершения ввода-вывода, вы можете воспользоваться преимуществом модели асинхронного программирования .Если вы обнаружите, что вы привязаны к вычислениям, то, в зависимости от ожидаемой среды выполнения (многоядерная / одноядерная), вы можете найти полезными многопоточные вычисления.Конечно, вы можете обнаружить, что оба случая применимы.

Кстати, вы также можете использовать многие функции .NET 4 для многопоточности в .NET 3.5, используя Reactive Extensions .В настоящее время я использую это в продуктивном приложении .NET 3.5.

3 голосов
/ 15 ноября 2011

Это определенно может принести некоторые улучшения при использовании TPL, который теперь доступен в .NET 4.

Все три шага потенциально могут быть разработаны для параллельной работы.

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

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

1 голос
/ 15 ноября 2011

Считаете ли вы, что приложения такого рода могут извлечь из них пользу, прежде чем приступить к разработке?

Не очень. Вы описываете трехступенчатую систему, в которой каждый этап тесно связан с вводом / выводом.

Я предполагаю, что у вас есть только 1 диск, что означает, что параллельная работа может даже замедлить его (больше операций поиска).

С другой стороны, этапы 2) и 3) могут быть достаточно интенсивными, чтобы увидеть некоторые улучшения.

Вам придется измерять, как обычно.

...