스케일 러블 소켓 프로그래밍에 실제로 참여하는 경우 Windows에서 IO 완료 포트보다 성능이 좋은 것은 없습니다.
이렇게 말한 결과 프로그램은 완료 포트 모델에 대해 큰 재 작성이 필요할 것입니다.
그러나 select()/FD_ISSET을 사용해도 성능을 향상시킬 수 있습니다. winsock2.h의 FD_SET에서 소켓의 배열하고 FD_SET 소켓을 추가하는 찾을 수 winsock2.h에
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;
또한 요소 카운터로 정의된다 : 여기
는 그것을 할 수있는 방법입니다 이 배열의 끝에서 FD_ISSET은 배열에서 선형 검색을 수행합니다. 당신이 소켓의 정렬 된 배열을 사용하는 매크로를 변경하면 지금
, 즉
다음 의존의 이진 검색을 수행하는 정렬 된 순서에 소켓을 추가 배열 FD_ISSET의 크기는 크게 향상 될 수 있습니다 (FD_SET의 성능은 다소 떨어지지 만 FD_SET는 거의 작동하지 않는다고 가정합니다).
유닉스에서 select()의 성능은 FD_SET 비트 맵이므로 FD_SET/FD_ISSET은 비트를 테스트하거나 설정하기 때문에 성능이 더 좋습니다. Windows에서는 소켓이 작은 양의 파일 설명자 번호가 아니기 때문에이 기술은 적용되지 않습니다. 이는 핸들이며 핸들의 스칼라 값은 클 수 있습니다.
감사합니다. 정확하게 필요한 것 같습니다. 지금 결정해야 할 주요 사항은 I/O 완료 포트로 서버를 다시 구현하거나 자바를 사용하는 것입니다 (자바가 실행되는 서버의 50 %와 레거시 프로그램의 50 %를 이미 보유하고 있기 때문에). 30 년 된 코드를 상속하는 것을 좋아합니다. Windows 성능 문제를 해결하라는 메시지가 전달됨. –
기타 유용한 링크 - http://msdn.microsoft.com/en-us/library/aa365198.aspx - http://int64.org/2009/05/13/high -performance-io-on-windows –