Маловероятно, что вы заметите разницу в производительности.
Внутри ядра select
добавляет ваш поток в «очередь ожидания» для каждого дескриптора, который вы выбираете, и переводит его в спящий режим. Если вы выберете дескрипторы n
, ваш поток будет добавлен в n
очереди ожидания. Когда с дескриптором происходит что-то, что может быть опрошено (например, данные поступают в сокет), все потоки в этой очереди ожидания просыпаются.
Выбор огромного количества дескрипторов добавит вас к огромному количеству очередей ожидания. После пробуждения ваш поток должен будет быть удален из всех тех очередей ожидания, включая те, в которых не было активности. Так что с этой стороны может быть небольшое преимущество в ожидании небольшого набора дескрипторов в нескольких потоках, а не огромного набора дескрипторов в одном потоке.
С другой стороны, select
само требует, чтобы ядро перебирало все возможные дескрипторы , чтобы увидеть, какие из них являются членами вашего fd_set
. Таким образом, на этой стороне может быть небольшое преимущество, если один поток выполняет вызов select
...
В целом, я думаю, это стирка.
Если вы собираетесь работать с большим количеством дескрипторов, вам лучше использовать более масштабируемый (хотя и непереносимый) механизм, такой как epoll
. При epoll
несколько потоков, каждый из которых обрабатывает пул дескрипторов, должны очень хорошо масштабироваться.