Pregunta

Estoy intentando utilizar la API Stream.BeginWrite Async I/O en .NET para una situación de alto rendimiento con muchos mensajes cortos.Como tal, una API de dispersión/recolección reducirá enormemente la cantidad de cambios de contexto (y el uso de CPU).¿Esta API utiliza la API LPBUFFERS Win32?¿Existe una API alternativa para Scatter/Gather I/O?

¿Fue útil?

Solución 4

No hay forma de dispersar/reunir E/S de sockets en .NET.Según una publicación de blog de MSFT, puede haber una API similar en .NET 4.5 (sea lo que sea...)

Otros consejos

Al observar las fuentes .net, la respuesta aceptada parece ser incorrecta.

SocketAsyncEventArgs tiene un BufferList atributo.Cuando se usa eso, en lugar del Buffer atributo que solo puede contener un único bloque contiguo de memoria, las operaciones pueden hacer uso de DMA de dispersión/reunión, como Socket.SendAsync(SocketAsyncEventArgs) usos WSASend internamente, que

permite especificar múltiples buffers de envío, lo que lo hace aplicable al tipo de E/S de dispersión/reunión

y Socket.SendAsync(SocketAsyncEventArgs) usos WSARecv, eso

permite especificar múltiples buffers de recepción, lo que lo hace aplicable al tipo de E/S de dispersión/reunión

No tengo las fuentes .net 3.5 a mano, pero BufferList existe desde .net 3.5, por lo que la dispersión/reunión podría haber sido compatible desde .net 3.5.Los requisitos mínimos del sistema operativo para WSASend y WSARecv están documentados como Windows Vista/Server 2003.

NÓTESE BIEN.No sé qué corriente estás usando, pero NetworkStream.BeginWrite envía un único búfer a WSASend, por lo que no puede usarlo para dispersión/recolección.

Me sorprendería que pudieras acceder a las API de dispersión/reunión desde BCL (es para l33t w1n32 haxx0rz, ¿sabes?), pero siempre está P/Invoke (que, según he descubierto, es sorprendentemente fácil de usar).

Si desea profundizar en las entrañas del marco, hay algunas formas de hacerlo:

1) Reflector

2) MS abrió recientemente la fuente para fines de depuración, puede acceder a ella con VS2008 si habilita la opción en Depuración/Opciones/General

3) Koders.com parece alojar también la fuente del marco:

http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top