많은 짧은 메시지가있는 처리량이 많은 상황에서 .NET의 Stream.BeginWrite 비동기 I/O API를 사용하려고합니다. 따라서, scatter/gather API는 컨텍스트 스위치 (및 CPU 사용)의 수를 엄청나게 줄일 것입니다. 이 API는 LPBUFFERS Win32 API를 전혀 사용합니까? 분산 형/수집 형 I/O를위한 대체 API가 있습니까?.NET에서 분산/비동기 소켓 I/O 수집
답변
.NET에서 소켓 분산/수집 I/O를 수행 할 방법이 없습니다. MSFT 블로그 게시물에 따르면 .NET 4.5에 유사한 API가있을 수 있습니다 (그게 무엇이든간에 ...)
BCL에서 분산/수집 API에 도달 할 수 있다면 놀라실 것입니다.하지만, 항상 P/Invoke가 있습니다 (사용하기가 쉽고, 찾았습니다). 당신이 할 수있는,
2) MS는 최근 디버깅을 위해 소스를 개방
1) 리플렉터 : 당신이 프레임 워크의 내장으로 파고하려면
는 그것을 할 수있는 몇 가지 방법이 있습니다 당신이 디버깅/옵션에서 옵션/일반
3) Koders.com을 사용하는 경우 VS2008로 한 단계가 너무 프레임 워크 소스를 호스팅하는 것 :
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109
.net 소스를 보면 승인 된 대답이 잘못되었습니다.
SocketAsyncEventArgs
에는 BufferList
속성이 있습니다. 그 사용하는 경우 Socket.SendAsync(SocketAsyncEventArgs)
내부적 WSASend
를 사용하기 때문에, 대신에 전용 메모리의 하나의 연속 블록을 저장할 수있는 Buffer
속성, 작업
다중 송신 버퍼 할 수 있는지, DMA를 수집/분산을 사용할 수있다 산란에 그것을 적용하고 지정된/
이 허용하는,
및
Socket.SendAsync(SocketAsyncEventArgs)
이WSARecv
를 사용하여 I/O의 유형을 수집 다수의 수신 버퍼 산란에 그것을 적용하게 지정할 수/
내가 3.5 소스 편리한 그물이없는 I/O의 유형을 수집하지만, BufferList
는 .NET 3.5부터 존재하므로 분산은/지원되었을 수 있습니다 모여 이후 .net 3.5. WSASend 및 WSARecv에 대한 최소 OS 요구 사항은 Windows Vista/Server 2003으로 설명되어 있습니다.
N.B. 어떤 스트림을 사용하고 있는지 알 수는 없지만 NetworkStream.BeginWrite
은 WSASend에 단일 버퍼를 전송하므로 분산/수집에는 사용할 수 없습니다.
블로그 게시물에 대한 링크가 있습니까? –