大量のネットワークおよびディスク I/O を生成する C# 5.0 コードがあります。このコードの複数のコピーを並行して実行する必要があります。次のテクノロジのうち、最高のパフォーマンスが得られる可能性が高いのはどれですか?
await を使用した非同期メソッド
TPL から直接 Task を使用する
TPL データフロー ナゲット
リアクティブ拡張
私はこの並列処理があまり得意ではありませんが、Thread などの低いレバーを使用するとパフォーマンスが大幅に向上する場合は、それも検討します。
大量のネットワークおよびディスク I/O を生成する C# 5.0 コードがあります。このコードの複数のコピーを並行して実行する必要があります。次のテクノロジのうち、最高のパフォーマンスが得られる可能性が高いのはどれですか?
await を使用した非同期メソッド
TPL から直接 Task を使用する
TPL データフロー ナゲット
リアクティブ拡張
私はこの並列処理があまり得意ではありませんが、Thread などの低いレバーを使用するとパフォーマンスが大幅に向上する場合は、それも検討します。
これは、シートベルトを最も早く外す方法を尋ねて、大西洋横断飛行の時間を最適化しようとするようなものです。
役立つ回答をしましょう。アクティビティの「クラス」のようにパフォーマンスを考えてください。それぞれが桁違いに遅くなります(少なくとも!)。
アクティビティ #3 の1 つでも実行すると、スレッド ライブラリの最適化などのアクティビティ #1 と #2 に典型的な最適化を実行しても意味がありません。それらは、ディスク ヒットによって完全に影が薄くなります。CPU トリックについても同様です。L2/L3 キャッシュ ミスが常に発生している場合は、アセンブリを手書きして数 CPU サイクルを節約する価値はありません (これが、最近では通常、ループ展開のようなものが悪い考えである理由です)。
では、これから何を導き出せるでしょうか?プログラムを高速化するには 2 つの方法があります。#3 から #2 に移動するか (実行内容によっては、これは不可能な場合が多い)、またはI/O を減らすことです。I/O とネットワークの速度は、最新のアプリケーションのほとんどで速度を制限する要因であり、最適化を試みる必要があります。
それは古い質問ですが、これを読んでいる人にとっては...
場合によります。1Gbps のリンクを 50B のメッセージで飽和させようとすると、生のソケットを介した単純なノンブロッキング送信でも CPU バウンドになります。一方、1Mbps のスループットに満足している場合、またはメッセージが 10KB を超えている場合は、これらのフレームワークのいずれかが機能します。
低帯域幅の状況では、使いやすさを優先することをお勧めします。つまり、async/await、Dataflow、Rx、TPL の順です。高帯域幅のアプリケーションは、低帯域幅であるかのようにプロトタイプを作成し、後で最適化する必要があることに注意してください。
Rx は高い同時実行性を考慮して設計されていないため、真の高帯域幅アプリケーションには、Rx を介した Dataflow をお勧めします。Raw TPL は最下層であり、複雑さを処理できれば、オーバーヘッドを最小限に抑えることが保証されます。専用スレッドを効率的に使用できれば、さらに高速になります。Async/await と Dataflow IMO では、パフォーマンスに違いはありません。オーバーヘッドは同等に見えるので、より適したものを選択してください。