Мой вопрос - уладить спор с моими коллегами о C ++ против C #.
Мы реализовали сервер, который принимает большое количество UDP-потоков. Этот сервер был разработан на C ++ с использованием асинхронных сокетов и перекрывающегося ввода-вывода с использованием портов завершения. Мы используем 5 портов завершения с 5 потоками. Этот сервер может легко обрабатывать пропускную способность 500 Мбит / с в гигабитной сети без потери пакетов / ошибок (мы не продвигали наши тесты дальше 500 Мбит / с).
Мы попытались повторно реализовать такой же сервер на C #, но не смогли достичь той же входящей пропускной способности. Мы используем асинхронный прием с использованием метода ReceiveAsync
и пула SocketAsyncEventArgs
, чтобы избежать накладных расходов на создание нового объекта для каждого вызова приема. Каждый SAEventArgs
имеет установленный буфер, поэтому нам не нужно выделять память для каждого приема. Пул очень и очень большой, поэтому мы можем поставить в очередь более 100 запросов на получение. Этот сервер не может обрабатывать входящую пропускную способность более 240 Мбит / с. При превышении этого лимита мы теряем некоторые пакеты в наших потоках UDP.
У меня такой вопрос: следует ли ожидать такой же производительности при использовании сокетов C ++ и сокетов C #? Я считаю, что при правильном управлении памятью в .NET производительность должна быть такой же.
Дополнительный вопрос: знает ли кто-нибудь хорошую статью / справочник, объясняющий, как сокеты .NET используют порты завершения ввода-вывода под капотом?