Кто-нибудь знает хорошую статью / справку, объясняющую, как сокеты .NET используют порты завершения ввода / вывода под капотом?
Я подозреваю, что единственной ссылкой будет реализация (т.е.Отражатель или другой сборочный декомпилятор).При этом вы обнаружите, что все асинхронные операции ввода-вывода проходят через порт завершения ввода-вывода с обработкой обратных вызовов в пуле потоков ввода-вывода (который отделен от обычного пула потоков).
использовать 5 портов завершения
Я ожидал бы использовать один порт завершения, обрабатывающий все операции ввода-вывода в единый пул потоков с одним потоком на завершение обслуживания пула (при условии, что вы выполняете любой другой ввод-вывод,включая диск, также асинхронно).
Многократные порты завершения имели бы смысл, если бы у вас была какая-то форма приоритетов.
Мой вопрос таков: следует ли ожидать одинаковой производительностииспользовать сокеты C ++ и сокеты C #?
Да или нет, в зависимости от того, насколько узко вы определяете часть «using ... sockets».С точки зрения операций от начала асинхронной операции до отправки сообщения о завершении в порт завершения, я не ожидал бы существенной разницы (вся обработка выполняется в Win32 API или ядре Windows).
Однако безопасностьто, что обеспечивает среда выполнения .NET, добавит некоторые накладные расходы.Например.будут проверяться длины буфера, проверяться делегаты и т. д. Если ограничение для приложения равно ЦП, это, вероятно, будет иметь значение, и в крайнем случае можно легко добавить небольшую разницу.
Также версия .NETвремя от времени приостанавливается для GC (.NET 4.5 выполняет асинхронный сбор, так что в будущем это станет лучше).Существуют методы, позволяющие свести к минимуму накопление мусора (например, повторно использовать объекты, а не создавать их, использовать структуры, избегая упаковок).
В конце концов, если версия C ++ работает и отвечает вашим потребностям в производительности, зачем порт?