J'essaie d'utiliser l'API d'E/S Async Stream.BeginWrite dans .NET pour une situation à haut débit avec de nombreux messages courts. En tant que tel, une API scatter/gather réduit énormément le nombre de commutateurs de contexte (et d'utilisation du processeur). Cette API utilise-t-elle l'API LPBUFFERS Win32? Existe-t-il une autre API pour Scatter/Gather I/O?Scatter/rassembler des E/S socket asynchrones dans .NET
Répondre
Il n'y a aucun moyen de faire des E/S socket scatter/gather dans .NET. Selon un article de blog MSFT, il peut y avoir une API similaire dans .NET 4.5 (quoi que ce soit ...)
Je serais surpris si vous pouviez obtenir les APIs de scatter/gather de la BCL (c'est pour le l33t w1n32 haxx0rz, vous savez?), Mais il y a toujours P/Invoke (qui est étonnamment facile à utiliser, je ' J'ai trouvé).
Si vous voulez creuser dans les entrailles du cadre, il y a quelques façons de le faire:
1) réflecteur
2) MS a récemment ouvert la source à des fins de débogage, vous pouvez dans l'étape avec VS2008 si vous activez l'option sous Debugging/options/général
3) Koders.com semblent accueillir la source cadre aussi:
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109
En regardant les sources .net, la réponse acceptée semble être fausse.
SocketAsyncEventArgs
a un attribut BufferList
. Lorsque cela est utilisé, au lieu de l'attribut Buffer
qui ne peut contenir un seul bloc contigu de mémoire, les opérations peuvent utiliser scatter/gather DMA, comme Socket.SendAsync(SocketAsyncEventArgs)
utilise WSASend
en interne, que
permet des tampons multiples émission à spécifié rendant applicable à la ventilation/regroupement type d'E/S
et Socket.SendAsync(SocketAsyncEventArgs)
utilise WSARecv
que
permet à de multiples tampons de réception à préciser le rendant applicable au scatter/gather type d'E/S
Je n'ai pas le .net 3.5 sources à portée de main, mais BufferList
existe depuis 3,5 .net, donc scatter/gather aurait pu être pris en charge depuis .net 3.5. La configuration minimale requise pour WSASend et WSARecv est documentée sous Windows Vista/Server 2003.
N.B. Je ne sais pas quel flux vous utilisez, mais NetworkStream.BeginWrite
envoie un seul tampon au WSASend, donc vous ne pouvez pas l'utiliser pour disperser/rassembler.
Avez-vous un lien vers cet article? –