私の質問は、同僚と C++ と C# の議論を解決することです。
大量の UDP ストリームを受信するサーバーを実装しました。このサーバーは、完了ポートを使用して非同期ソケットとオーバーラップ I/O を使用して C++ で開発されました。5 つのスレッドで 5 つの完了ポートを使用します。このサーバーは、ギガビット ネットワークで 500 Mbps のスループットをパケットの損失やエラーなしで簡単に処理できます (500 Mbps を超えるテストは行いませんでした)。
C# で同じ種類のサーバーを再実装しようとしましたが、同じ受信スループットに到達できませんでした。ReceiveAsync
メソッドとプールを使用した非同期受信を使用してSocketAsyncEventArgs
、受信呼び出しごとに新しいオブジェクトを作成するオーバーヘッドを回避しています。それぞれSAEventArgs
にバッファが設定されているため、受信ごとにメモリを割り当てる必要はありません。プールは非常に大きいため、100 を超える受信要求をキューに入れることができます。このサーバーは、240 Mbps を超える受信スループットを処理できません。その制限を超えると、UDP ストリームでいくつかのパケットが失われます。
私の質問は次のとおりです。C++ ソケットと C# ソケットを使用して同じパフォーマンスを期待する必要がありますか? 私の意見では、.NET でメモリが正しく管理されていれば、同じパフォーマンスになるはずです。
副次的な質問: .NET ソケットが内部で I/O 完了ポートをどのように使用するかを説明している良い記事/リファレンスを知っている人はいますか?