2010-11-27 27 views
1

私はメッセージルータを構築しており、可能な限り速くしたいと考えています。 私はC#4.0にとどまり、できるだけ早くソケットを使いたいと思っています。 すべてのデータを管理対象メモリに保存する必要はありません。私はバイト配列を取り扱っておりますし、(より良いオプションが発見されていない限り)、このメソッドを使用して管理するメモリにデータを持って来るのです :http://www.codeproject.com/KB/cs/ReadingStructuresEmit.aspx安全でないC#でWs2_32.dllを使用していますが、.NETソケットよりも高速ですか?

質問:

1)安全ではないのソケットを使用して、パフォーマンスの向上があります?いくら?

2)全ての構造体は、同様に安全でないと、このような安全でない方法を使用するときにヒットをマーシャリングのPInvokeまたはデータ()

public unsafe partial class Native 

{

[DllImport("Ws2_32.dll")] 
    public static extern int connect(SOCKET s, sockaddr_in* addr, int addrsize); 

}

3はあり)#2の場合、データ処理が危険な状態で行われ、安全でないメソッドがデータを返さない場合は重要です(は何もありません)。マネージドにマーシャリングされた)?

答えて

5

このような改良は、測定可能な効果をもたらすものではありません。 実際のの作業は、TCP/IPドライバスタックの多くのレイヤーであるカーネルモードで行われます。たくさんのコードがIRPパケットの盗聴をしたいと思っています。そして最終的にNICに当たる。それが実際のスロットルが起こる場所です。 1ギガビットイーサネットインターフェイスは一般的なハイエンドです。これは、CPUがデータをシャベルする速度と比較して、ピーナッツです。遅いRAMバスでも、データを40倍高速で簡単に移動できます。一度ネットワークに接続すると、実際に接続を確立することに伴う待ち時間については言及しません。

これらのパスは、System.Netと同様にws2_32.dllによって取得されます。あなたはそれを測定すべきです。私の予測は、あなたが騒音についての信号を見ることができないということです。

+0

私の考えでは、管理された<->の管理されていないコールは高価です。管理されたスペースにすべてのメッセージが必要なわけではないので、安全ではないかもしれません。 – Joe

+0

* unsafe *キーワードでアンマネージコードにすることはできません。ネットワーキングAPIはあなた自身をピンボケしても、System.Netがそれをあなたに任せても、違いはありません。繰り返しますが、実際にこれを測定して自分自身を説得してください。 –

1

どのラッパーでもオーバーヘッドが導入されるため、P /直接ソケットライブラリへの呼び出しが高速になります。問題はどれくらい速いかです。

各アプローチのベンチマークを試しましたが、どちらが優れていますか?これはこれを判断するのに非常に良い方法です。パフォーマンスの差がごくわずかであれば、マネージドソケットクラスに固執してコードを読みやすくする方がよいでしょう。

+0

私はそれをベンチマークしようとしていません。私はそれを実装する前に改善がどれくらいあるかを知りたいと思っていました。 – Joe

+0

私の推測では、改善は目立たないということです。 – cdhowie

関連する問題