22

大量のネットワークおよびディスク I/O を生成する C# 5.0 コードがあります。このコードの複数のコピーを並行して実行する必要があります。次のテクノロジのうち、最高のパフォーマンスが得られる可能性が高いのはどれですか?

  • await を使用した非同期メソッド

  • TPL から直接 Task を使用する

  • TPL データフロー ナゲット

  • リアクティブ拡張

私はこの並列処理があまり得意ではありませんが、Thread などの低いレバーを使用するとパフォーマンスが大幅に向上する場合は、それも検討します。

4

3 に答える 3

65

これは、シートベルトを最も早く外す方法を尋ねて、大西洋横断飛行の時間を最適化しようとするようなものです。

わかりました、いくつかの本当のアドバイス、私は一種のジャークだったので

役立つ回答をしましょう。アクティビティの「クラス」のようにパフォーマンスを考えてください。それぞれが桁違いに遅くなります(少なくとも!)。

  1. CPU のみにアクセスし、メモリをほとんど使用しない (つまり、非常に単純なグラフィックスを非常に高速な GPU にレンダリングするか、Pi の数字を計算する)
  2. CPU とメモリ内のものにのみアクセスし、ディスクには何もアクセスしません (つまり、適切に作成されたゲーム)。
  3. ディスクへのアクセス
  4. ネットワークにアクセスしています。

アクティビティ #3 の1 つでも実行すると、スレッド ライブラリの最適化などのアクティビティ #1 と #2 に典型的な最適化を実行しても意味がありません。それらは、ディスク ヒットによって完全に影が薄くなります。CPU トリックについても同様です。L2/L3 キャッシュ ミスが常に発生している場合は、アセンブリを手書きして数 CPU サイクルを節約する価値はありません (これが、最近では通常、ループ展開のようなものが悪い考えである理由です)。

では、これから何を導き出せるでしょうか?プログラムを高速化するには 2 つの方法があります。#3 から #2 に移動するか (実行内容によっては、これは不可能な場合が多い)、またはI/O を減らすことです。I/O とネットワークの速度は最新のアプリケーションのほとんどで速度を制限する要因であり、最適化を試みる必要があります。

于 2013-04-17T04:25:51.483 に答える
16

それは古い質問ですが、これを読んでいる人にとっては...

場合によります。1Gbps のリンクを 50B のメッセージで飽和させようとすると、生のソケットを介した単純なノンブロッキング送信でも CPU バウンドになります。一方、1Mbps のスループットに満足している場合、またはメッセージが 10KB を超えている場合は、これらのフレームワークのいずれかが機能します。

低帯域幅の状況では、使いやすさを優先することをお勧めします。つまり、async/await、Dataflow、Rx、TPL の順です。高帯域幅のアプリケーションは、低帯域幅であるかのようにプロトタイプを作成し、後で最適化する必要があることに注意してください。

Rx は高い同時実行性を考慮して設計されていないため、真の高帯域幅アプリケーションには、Rx を介した Dataflow をお勧めします。Raw TPL は最下層であり、複雑さを処理できれば、オーバーヘッドを最小限に抑えることが保証されます。専用スレッドを効率的に使用できれば、さらに高速になります。Async/await と Dataflow IMO では、パフォーマンスに違いはありません。オーバーヘッドは同等に見えるので、より適したものを選択してください。

于 2013-12-19T16:41:59.080 に答える