Сколько потоков я могу создать до снижения эффективности? - PullRequest
0 голосов
/ 21 сентября 2010

Существует ли какая-либо формула, возможно, включающая ОЗУ и количество процессоров, которая может дать мне приблизительное представление о том, сколько потоков я могу порождать до того, как они станут неэффективными и замедляют работу ПК?

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


Редактировать: потоки выполняют удаленные вызовы процедур (SOAP), поэтому будут блокировать ожидание возврата вызова.

Ответы [ 4 ]

3 голосов
/ 21 сентября 2010

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

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

2 голосов
/ 21 сентября 2010

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

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

1 голос
/ 21 сентября 2010

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

Я часто нахожу, что на этот вопрос отвечают архитектура и требования приложения; вам нужно столько нитей, сколько вам нужно.

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

0 голосов
/ 21 сентября 2010

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

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

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