Многопоточность имеет смысл для операций IO-bound?

Возможно, наименее документированные функции в VBA - это те, которые вы можете открыть, только выбрав «Показать скрытых участников» в Обозревателе объектов VBA. Скрытые члены - это те функции, которые есть в VBA, но не поддерживаются. Вы можете использовать их, но Microsoft может устранить их в любое время. Ни у одного из них нет документации, но вы можете найти ее в Интернете. Возможно, наиболее обсуждаемые из этих скрытых функций предоставляют доступ к указателям в VBA. Для достойной рецензии, проверьте; Не так легко - Shlwapi.dll

Задокументировано, но, возможно, более неясно (в любом случае в Excel) использует ExecuteExcel4Macro для доступа к скрытому глобальному пространству имен, которое принадлежит всему экземпляру приложения Excel, а не конкретная рабочая тетрадь.

33
задан Aidan Ryan 23 May 2009 в 20:41
поделиться

7 ответов

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

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

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

Я не

40
ответ дан 27 November 2019 в 18:25
поделиться

Это зависит от вашего определения «ограничения ввода-вывода», но обычно многопоточность имеет два эффекта:

  • Использование нескольких процессоров одновременно (что не обязательно поможет, если узким местом является диск, а чем CPU [s])

  • Используйте CPU (с другим потоком), даже если один поток заблокирован (например, ожидает завершения ввода-вывода)

Я не уверен, что ответ Конрада всегда правильный, однако : в качестве контрпримера, если «ограничение ввода-вывода» означает просто «один поток проводит большую часть своего времени в ожидании завершения ввода-вывода вместо использования процессора», но не означает, что «мы достигла предела пропускной способности системы ввода-вывода ", то IMO, имеющая несколько потоков (или асинхронный ввод-вывод), может улучшить производительность (за счет включения более одной одновременной операции ввода-вывода).

6
ответ дан 27 November 2019 в 18:25
поделиться

Я думаю, это зависит от ряда факторов, таких как тип приложения, которое вы запускаете, количество одновременно работающих пользователей и т. Д.

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

Но ваш пробег может отличаться.

3
ответ дан 27 November 2019 в 18:25
поделиться

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

Это в основном помощь в ясном программировании, а не производительности.

2
ответ дан 27 November 2019 в 18:25
поделиться

Я бы подумал, что это помешает операциям ... У вас только один контроллер и один диск.

Вы можете использовать второй поток для выполнения операции и основной поток, который показывает обновленный интерфейс.

0
ответ дан 27 November 2019 в 18:25
поделиться

Нет, это не имеет смысла. В какой-то момент операции должны быть сериализованы (ОС). С другой стороны, поскольку современные ОС все равно должны справляться с множеством процессов, я сомневаюсь, что это дополнительные накладные расходы.

0
ответ дан 27 November 2019 в 18:25
поделиться

Я думаю, что это может ухудшить производительность, потому что несколько потоков будут конкурировать за одни и те же ресурсы.

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

0
ответ дан 27 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: