2011-09-28 6 views
2

windows에서 recv 함수를 사용하여 소켓에서 데이터를 수신한다고 가정 해 보겠습니다. 최적의 버퍼가 얼마나 클지 궁금합니다. 나는 그것을 1024 바이트로 만들 수 있습니다. 또는 51200 바이트 이상으로 만들 수 있습니다. 어느 것이 성능면에서 더 좋을지 궁금합니다.C Windows 버퍼 크기

이 기능은 recv 기능에만 적용되는 것이 아니라 큰 텍스트 파일을 읽거나 매우 큰 버퍼 또는 작은 버퍼를 원하십니까?

답변

3

운영 체제가 자체 버퍼링을 수행하므로 버퍼 크기가 중요하지 않습니다. 성능상의 불이익은 함수 호출에 있습니다. 1 바이트 버퍼는 recv()을 너무 많이 호출해야하므로 비효율적입니다. 너무 큰 버퍼는 단지 공간 낭비 일뿐입니다.

최적 크기는 수신 할 것으로 예상되는 데이터의 두 배 크기이거나 단일 recv() 호출에서 처리 할 수있는 크기이며 약 1 또는 2 tcp 프레임의 하한이 있습니다.

저는 개인적으로 4KB 버퍼를 사용합니다.하지만 그건 내 자신의 취향이고, 주로 쓰는 응용 프로그램에 달려 있습니다.

0

운영 체제가 이미 버퍼링하므로 한 번에 한 바이트 만 읽을 수도 있습니다.

+4

한 컨텍스트 스위치가되지 않습니다 당신에게 "성능 어워드에서 최고의 품종"을 줄 것입니다 ... –

0

예상되는 데이터의 종류와 예상 프로토콜에 따라 다릅니다. 예를 들어 UDP는 전체 패킷을 한 번에 전달하므로 최적의 버퍼 크기는 1500이 될 수 있습니다.

실제 성능 장애는 수행 할 함수 호출 (이 경우 recv)입니다. 성능을 향상 시키려면 기본 큰 값으로 시작한 다음 수신중인 패킷 크기를 분석 할 수 있습니다. 분석을 바탕으로 (거의) "이상적인"버퍼 크기를 전달할 수 있습니다.

0

서버 유형 상황에 따라 실행될 서비스를 모를 경우 다양한 크기의 버퍼 풀 배열을 사용할 수 있습니다 (예 : [128,1024,4096,16384,65536 ]. 뭔가가 연결되면 128 크기를 사용하고, 128이 모두 들어 오면 다음에 1024를 사용하십시오.

알려진 프로토콜/로딩 클라이언트 나 서버에

, 그냥 그렇다고 다른 포스터 :

RGDS, 마틴에 의해 제안 많이 (그것은 추측

바이트 당