Сокеты .NET против сокетов C ++ при высокой производительности

Мой вопрос - уладить спор с моими коллегами о C ++ против C #.

Мы реализовали сервер, который принимает большое количество UDP-потоков. Этот сервер был разработан на C ++ с использованием асинхронных сокетов и перекрывающегося ввода-вывода с использованием портов завершения. Мы используем 5 портов завершения с 5 потоками. Этот сервер может легко обрабатывать пропускную способность 500 Мбит / с в гигабитной сети без потери пакетов / ошибок (мы не продвигали наши тесты дальше 500 Мбит / с).

Мы попытались повторно реализовать такой же сервер на C #, но не смогли достичь той же входящей пропускной способности. Мы используем асинхронный прием с использованием метода ReceiveAsync и пула SocketAsyncEventArgs , чтобы избежать накладных расходов на создание нового объекта для каждого вызова приема. Каждый SAEventArgs имеет установленный буфер, поэтому нам не нужно выделять память для каждого приема. Пул очень и очень большой, поэтому мы можем поставить в очередь более 100 запросов на получение. Этот сервер не может обрабатывать входящую пропускную способность более 240 Мбит / с. При превышении этого лимита мы теряем некоторые пакеты в наших потоках UDP.

У меня такой вопрос: следует ли ожидать такой же производительности при использовании сокетов C ++ и сокетов C #? Я считаю, что при правильном управлении памятью в .NET производительность должна быть такой же.

Дополнительный вопрос: знает ли кто-нибудь хорошую статью / справочник, объясняющий, как сокеты .NET используют порты завершения ввода-вывода под капотом?

45
задан John Saunders 11 December 2011 в 17:50
поделиться