Максимизация количества потоков для полного использования всех доступных ресурсов без снижения общей производительности. - PullRequest
1 голос
/ 07 мая 2010

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

Ответы [ 3 ]

4 голосов
/ 07 мая 2010

Без дополнительных подробностей я бы предположил, что эта задача связана с вводом / выводом, а не с процессором, так что вы, вероятно, только добавите накладные расходы на мой запуск нескольких потоков. Я бы порекомендовал использовать асинхронный ввод-вывод и тем самым позволить пулу потоков обрабатывать детали. Следует признать, что это может оказаться не самым оптимальным решением, но это все равно будет моя первая попытка, поскольку есть вероятность, что она будет достаточно хорошей.

1 голос
/ 07 мая 2010

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

1 голос
/ 07 мая 2010

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

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

...