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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top