I / O socket asincrono di dispersione / raccolta in .NET
-
02-07-2019 - |
Domanda
Sto provando a utilizzare l'API di I / O asincrono Stream.BeginWrite in .NET per una situazione di throughput elevato con molti messaggi brevi. Pertanto, un'API scatter / gather ridurrà enormemente il numero di switch di contesto (e utilizzo della CPU). Questa API utilizza l'API Win32 LPBUFFERS? Esiste un'API alternativa per Scatter / Gather I / O?
Soluzione 4
Non esiste alcun modo per eseguire I / O socket scatter / gather in .NET. Secondo un post sul blog MSFT, potrebbe esserci un'API simile in .NET 4.5 (qualunque cosa sia ...)
Altri suggerimenti
Osservando le fonti .net, la risposta accettata sembra essere sbagliata.
SocketAsyncEventArgs
ha un BufferList
. Quando viene utilizzato, invece dell'attributo Buffer
che può contenere solo un singolo blocco contiguo di memoria, le operazioni possono utilizzare il DMA scatter / gather, come Socket.SendAsync (SocketAsyncEventArgs)
utilizza WSASend
internamente , quello
consente di specificare più buffer di invio rendendolo applicabile al tipo di I / O scatter / gather
e Socket.SendAsync (SocketAsyncEventArgs )
utilizza WSARecv
, quello
consente di specificare più buffer di ricezione rendendolo applicabile al tipo di I / O scatter / gather
Non ho le fonti .net 3.5 a portata di mano, ma BufferList
esiste da .net 3.5, quindi scatter / gather potrebbe essere supportato da .net 3.5. I requisiti minimi di sistema operativo per WSASend e WSARecv sono documentati come Windows Vista / Server 2003.
NB. Non so quale stream stai utilizzando, ma NetworkStream.BeginWrite
invia un singolo buffer a WSASend, quindi non puoi usarlo per scatter / raccolta.
Sarei sorpreso se potessi arrivare allo scatter / raccogliere gli API dal BCL (è per l33t w1n32 haxx0rz, sai?), ma c'è sempre P / Invoke (che è sorprendentemente facile da usare, ho trovato).
Se vuoi scavare nelle viscere del framework, ci sono alcuni modi per farlo:
1) Riflettore
2) MS ha recentemente aperto l'origine a scopo di debug, è possibile entrarci con VS2008 se si abilita l'opzione in Debug / Opzioni / Generale
3) Koders.com sembra ospitare anche la fonte del framework:
http://www.koders.com/csharp /fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109