2012-03-28 23 views
5

私は現在クライアントアプリケーションをプログラミングしていますが、SocketクラスのReceiveAsyncまたはBeginReceiveメソッドを使用する必要があるのか​​どうかは疑問です。私はこれまでの後者を使用していましたが、CPUにかなりのストレスがかかるようです。私はここで何か間違ったことをやっている場合今、私はほとんどすべてでCPUを強調していない通信を行う他のアプリケーションから、思ってきたReceiveAsyncとBeginReceiveのパフォーマンス

private void socket_ReceiveCallback(IAsyncResult result_) 
{ 
    // does nothing else at the moment 
    socket.EndReceive(result_); 
    byte[] buffer = (byte[])result_.AsyncState; 

    // receive new packet 
    byte[] newBuffer = new byte[1024]; 
    socket.BeginReceive(newBuffer, 0, newBuffer.Length, SocketFlags.None, 
         socket_ReceiveFallback, newBuffer); 
} 

:ここでループは基本的にのように見える受け取る私のものです。また、SocketAsyncEventArgsとReceiveAsyncを使用する方が良いかどうかも疑問に思っています。だからここ

は私の質問です:

はなぜ私のループはそんなにCPUを強調していますか? BeginReceiveの代わりにSocketAsyncEventArgsとReceiveAsyncを使用する必要がありますか?

+0

を私はあなたがあなたのメトを呼び出しているbecuaseそれは賭けあなたのコアのうちの1つを最大限に活用するために、ブロッキングがないループで - ManualResetEventクラスを使用して、必要に応じて手動ブロッキングを行います。 – markmnl

+0

"socket_ReceiveFallback"はまったく別の実装方法ですか? – markmnl

答えて

5

私は、ローカルホストのループバック接続で同期と非同期ソケットのベンチマークを行っています。私の結果は、非同期バージョンが約30%遅かったということでした。これは、非同期IOがすべて激怒していることを考慮すると私には驚きでした。私が使ったスレッドの数は関係ありませんでした。私は128スレッドを使用することができ、まだ同期IOは高速でした。

その理由は、非同期IOにはより多くの割り当てとより多くのカーネルモードの移行が必要なためです。

何百もの同時接続が予想されない場合は、同期IOに切り替えることができます。

+0

私は1台のサーバーにのみ接続しています。だから、基本的にはReceiveとSendの通常のメソッドを使うことができますか?私はそれを非同期にしたい場合は、別のスレッドでクラス全体を作成することができますが、おそらくそれほど遅くならないでしょう。 – haiyyu

+1

私はこのオプションを間違いなくベンチマークします。私の推測では、同期バージョンが高速になります。さらにメンテナンス可能! – usr

+0

私はそれを行い、後で結果を掲載します。また、私は "私は別のスレッドでオブジェクト全体(クラスではない)を作成することができた"と言っていた。 – haiyyu

1

これに答えると、アプリケーションをプロファイルする必要があります。 私はEndReceive

  • あなたは再び新しいバッファ時間と時間を割り当てるなぜあなたはすべての と
  • で受信バッファを使用していない理由を見ない、なぜ私が疑問に思うことは

    • である - これが唯一のopperationですここではすべてのリソース(CPU /メモリ)

    にこれを見て持って取るべきである:http://msdn.microsoft.com/de-de/library/dxkwh6zw.aspx

  • +0

    1)申し訳ありません、コードに追加するのを忘れてしまいました。それはプログラムにあります。私は自分の投稿を編集しました。 2)私はそれを使用する予定です。しかし、それを使用しなくても、サーバーはCPUに多くの負荷をかけます。 3)バッファプールを作成するのは賢明でしょうか?私はそれを行い、何かが変化するかどうかをテストするでしょう!ご協力いただきありがとうございます。 – haiyyu

    +0

    この時点では、小さなブロック(1kB)のみを転送し、遅滞なくこれを行うので、ハードウェアがその作業をするのをあまり待っているわけではありません(同じマシンでこれを行うとさらに真実です) 、システムは非同期呼び出しを作成するために忙しいです。しかし、私は実際に良いプロファイラ(ほとんど試練)を見つけることを推奨したり、ビルド(私はVS prof以上と思う)を使用して弱点を見つけることを推奨します – Carsten

    関連する問題