2013-05-10 4 views
2

NetworkStream에서 읽을 때 byteSize를 설정해야하는 크기를 알아 내려고합니다. 더 크거나 큰 숫자를 사용하는 것이 무엇이겠습니까?NetworkStream에서 읽기. 어떤 바이트 크기를 사용해야합니까?

나는 많은 예제를 사용하여 256을 보았습니다. 왜? 당신이 당신의 코드 i에 따라 설정간에

int byteSize = 256; 

TcpListener server = new TcpListener(IPAddress.Any, 9999); 
server.Start(); 
Byte[] bytes = new Byte[byteSize]; 

TcpClient client = server.AcceptTcpClient(); 

NetworkStream stream = client.GetStream(); 
int i = 0; 

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
{ 
    // Do stuff with the stream 
} 
+0

'bytesSize' 또는'bufferSize' 이름이 더 명확합니다. –

답변

2

너무 작게 설정하면 .NET에서 운영 체제 호출을 자주 수행하여 버퍼를 다시 채워야 할 때 효율성을 잃을 수 있습니다. 그것을 너무 크게 만들고 약간의 기억을 낭비하십시오.

그다지 중요하지는 않지만 256은 저사양입니다. 매우 일반적인 I/O 버퍼 크기는 4096 바이트입니다. Windows에서 메모리 페이지의 크기 인 마법 숫자입니다. 버퍼가 우연히 만 한 페이지를 정확히 횡단 할지라도.

+0

단순화하려면 다음을 수행하십시오. 하위 = 성능 저하, 상위 = 메모리 사용 증가? – CathalMF

+2

예. 나는 짧은 대답을 게시 할 수 없다, 그들은 의견으로 변환 얻을. –

0

소켓에서 읽을 실제 바이트, 그래서 i 거의 작은 byteSize보다 인 경우 byteSize은 도움이되지 않습니다. 당신의 내부

i 작은 그 byteSize 경우 while 당신은 확인해야합니다 그렇다면, 메모리 스트림 또는 파일 스트림, 즉 안전한 장소에 byte (바이트 배열)의 첫 번째 i 바이트를 복사에 소켓을 읽고 계속 네트워크 스트림의 끝 (i = 0)으로 이동합니다. 1024, 2048 및 4096은 네트워크 속도, 사용 가능한 메모리 및 이러한 버퍼를 사용하는 스레드에 따라 양호한 것으로 보입니다. 예를 들어, 1024 개의 버퍼 크기를 가진 100 개의 쓰레드를 사용하면 100KB의 RAM이 필요합니다.

대부분 개인적으로 스마트 버퍼를 사용합니다. 런타임에는 버퍼 크기와 비교하여 읽기 양을 확인하고 더 나은 결과를 얻을 수 있도록 수정합니다 (프로젝트에 따라 가치가 있다고하더라도).

+0

스마트 버퍼를 정확히 구현하는 방법은 무엇입니까? 이전 읽기에 대해 가정하고 버퍼 크기로 설정하여 다음 읽기 양이 비슷하다고 가정합니다. – CathalMF

+1

@CathalMF : 저는 2048과 같은 것으로 시작합니다. 예를 들어'i'는 그것과 같고'4096'을 만들고'i'는'my'가 내 버퍼보다 ​​조금 작아지기 전까지'i'와 다시 비교합니다. 또한 차이가 커지면 메모리가 중요한 경우 버퍼를 작게 만듭니다. 스레드가 많은 경우 순환 버퍼를 사용하여 메모리 조각화를 방지합니다 (로드가 많은 컴퓨터에서는 희소 한 상태 임). – Xaqron