Производительность Windows Posix сокетов - PullRequest
1 голос
/ 11 мая 2011

Я ищу информацию о сетевом программировании Windows. Главным образом, как получить один исполняемый файл для 1000 соединений.

Мы используем select () FD_ISSET и т. Д. В Unix, и это работает очень быстро. В Windows эти API очень плохие. FD_SET намного медленнее, но даже при работе с этим Windows работает намного медленнее, чем HPUX.

Я ищу вызов win32 API, который я могу использовать вместо вызова select (), который не требует так много процессорного времени. В настоящее время мы тратим 50% времени (и ЦП) в select (), где, как и в Unix, время, потраченное в send () и recv (), что я и ожидал.

Спасибо Neil

Ответы [ 2 ]

2 голосов
/ 11 мая 2011
1 голос
/ 11 мая 2011

Если вы действительно занимаетесь программированием масштабируемых сокетов, ничто не может превзойти порты завершения ввода-вывода в 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, и скалярное значение дескриптора может быть большим.

...