Очень хорошее эмпирическое правило при выполнении интенсивных задач состоит в том, чтобы запустить тот же номер, что и физическое ядро сосчитать.
Да, вы можете запускать больше задач, но они будут ждать ресурсов (или потоков в пуле потоков), и ваше поле, независимо от размера, не может полностью распределить все основные ресурсы процессора в 100% случаев поток из-за фона/других процессов. Таким образом, чем больше задач вы создаете, тем больше потоков вы создаете, так как они превосходят фактические возможные параллельные потоки (1 на ядро), тем больше будет управление ресурсами, очередью и обменом.
Тест, который мы выполнили, где я сейчас работаю, с использованием вирусного шаблона для запуска дополнительных задач, показал, что оптимальный уровень близок к счету процессора как кепка. Задачи, запущенные при соотношении «один к одному» с физическим числом ядер, выполнялись примерно на 1 минуту за каждую задачу. Устанавливается в два раза по счетчику процессора, время задачи перешло с 1 минуты в среднем до 5 минут среднего времени для завершения. Он становится геометрически медленнее, чем больше задач, инициированных за счет ядра.
Так, например, если у вас есть 8 физических ядер, 8 задач (и использование TPL, по существу 8 одновременных потоков в активном процессе) должны быть самыми быстрыми. Существует ваш основной поток или процесс, который создает другие задачи и другие фоновые процессы, но если ящик довольно изолирован для удовольствия от использования ресурсов, они будут довольно минимальными.
Поверхность программирования колпачка вашей задачи основана на подсчете ядра, когда вы жуете задачи из очереди или списка, поэтому при развертывании приложения на разных размерах оно автоматически настраивается.
Чтобы определить это программно, мы используем
var CoreCount = System.Environment.ProcessorCount/2;
Почему разделить на две части, спросите вы? Потому что почти все современные процессоры используют логические ядра или гиперпотоки. Вы должны найти со своим собственным тестированием, что, если вы используете логический счет, ваша общая скорость на одну задачу и, следовательно, весь процесс значительно снизится. Физические ядра - это ключ. Мы не могли видеть быстрый способ найти физическое против логического, но быстрый обзор наших ящиков показал, что это последовательно верно. YMMV, но это может стать довольно быстрым.
Каковы темы? –
+1 хороший вопрос. Каждый из них делает один вызов SOAP для передачи данных сома и ждет его возврата. – Mawg
За исключением, конечно, что «возврат» асинхронный, поэтому они не очень ждут. Другие потоки могут запускаться, как только запрос SOAP (вызов fcuntion) отправляется по HTTP – Mawg