Если вы действительно занимаетесь программированием масштабируемых сокетов, ничто не может превзойти порты завершения ввода-вывода в Windows.
Сказав это, вашей программе, вероятно, потребуется большая перезапись для модели портов завершения.
Тем не менее, можно улучшить производительность даже с помощью select () / FD_ISSET.
Вот как это можно сделать: в winsock2.h fd_set определяется как массив SOCKET и счетчик элементов
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;
Также в winsock2.h вы обнаружите, что FD_SETдобавляет SOCKET в конец этого массива, и FD_ISSET выполняет линейный поиск в массиве.
Теперь, если вы измените макросы на использование отсортированного массива SOCKET, т.е.
- FD_SETдобавляет сокеты в отсортированном порядке
- FD_ISSET выполняет бинарный поиск вместо линейного
, тогда в зависимости от размера массива FD_ISSET может быть значительно улучшено (хотя производительность FD_SET несколько снизится,но мы предполагаем, что FD_SET является редкой операцией).
В Unix производительность select () лучше, так как они FD_SET в виде битовой карты, FD_SET / FD_ISSET просто проверяет или устанавливает бит.В Windows этот метод не применим, поскольку сокет - это не маленький положительный номер дескриптора файла, это HANDLE, и скалярное значение дескриптора может быть большим.