Я пытаюсь использовать Stream.BeginWrite Async I / O API в .NET для высокопроизводительной ситуации с большим количеством коротких сообщений. Таким образом, API разброса / сбора данных значительно сократит количество переключений контекста (и использование ЦП). Использует ли этот API вообще LPBUFFERS Win32 API? Есть ли альтернативный API для ввода-вывода Scatter / Gather?





Я был бы удивлен, если бы вы могли получить доступ к api разброса / сбора из BCL (это для l33t w1n32 haxx0rz, понимаете?), Но всегда есть P / Invoke (который, как я обнаружил, на удивление прост в использовании).
Если вы хотите покопаться в самом фреймворке, есть несколько способов сделать это:
1) Отражатель
2) MS недавно открыла исходный код для целей отладки, вы можете войти в него с помощью VS2008, если включите опцию в разделе Отладка / Параметры / Общие.
3) Koders.com, похоже, тоже размещает исходный код фреймворка:
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109
В .NET нет способа выполнять ввод-вывод с разбросом / сбором сокетов. Согласно сообщению в блоге MSFT, аналогичный API может быть в .NET 4.5 (что бы это ни было ...)
Глядя на источники .net, принятый ответ кажется неправильным.
SocketAsyncEventArgs имеет атрибут BufferList. Когда это используется, вместо атрибута Buffer, который может содержать только один непрерывный блок памяти, операции могут использовать DMA разброса / сбора, поскольку Socket.SendAsync(SocketAsyncEventArgs) использует WSASend внутренне, что
allows multiple send buffers to be specified making it applicable to the scatter/gather type of I/O
и Socket.SendAsync(SocketAsyncEventArgs) использует WSARecv, что
allows multiple receive buffers to be specified making it applicable to the scatter/gather type of I/O
У меня нет под рукой исходников .net 3.5, но BufferList существует с .net 3.5, поэтому scatter / gather могли поддерживаться с .net 3.5. Минимальные требования к ОС для WSASend и WSARecv задокументированы как Windows Vista / Server 2003.
N.B. Я не знаю, какой поток вы используете, но NetworkStream.BeginWrite отправляет один буфер в WSASend, поэтому вы не можете использовать его для разброса / сбора.
У вас есть ссылка на это сообщение в блоге?