2

私はWPFアプリケーションに取り組んでいます。
画面/ビューで、WCF サービスを 6 回呼び出す必要があります。これらの呼び出しは、データを共有せず、相互に依存していないという意味で関連していません。TPL を使用して、これら 6 つの WCF サービス呼び出しを 6 つのタスクとして作成する予定です。現在、アプリケーションはシングル コア マシンまたはマルチ コア マシンのいずれかにデプロイされている可能性があります。

シングル コア マシンで TPL を使用すると、さまざまなタスクをタイム スプライスするために CPU スケジューラにかかるオーバーヘッドが原因で、実際にはタスクの完了にかかる時間が長くなると言われています。これは本当ですか。はいの場合、設計を続行するか、代替案を検討する必要があります。

代替案を検討する必要がある場合、それらの代替案は何ですか :) ?

4

3 に答える 3

5

CPU を集中的に使用する場合、シングル コア マシンで並列スレッドを実行すると、オーバーヘッドが追加されます。

あなたの場合、タスクは CPU 集中型ではなく、サービス呼び出しの応答を待っているため、シングル コア マシンで並列スレッドを非常にうまく実行できます。

サーバーが呼び出しを処理する方法によっては、とにかく時間の増加がない場合があります。呼び出しがサーバーでキューに入れられている場合、とにかくすべての呼び出しを実行するのにほぼ同じ時間がかかります。その場合は、呼び出しを順番に実行する方が簡単です。

于 2012-08-27T10:42:18.580 に答える
3

最善の策は、マルチコアとシングルコアを使用してプロファイリングすることです。ほとんどの BIOS はアクティブなコアの数を設定できるので、大きな問題にはなりません。模擬テストを行って、それが機能するかどうかを確認できます。

明らかに、タスク切り替えを使用するとオーバーヘッドの問題が発生しますが、各タスクの時間がセットアップ時間よりもはるかに長い限り、気付かないでしょう。

マルチタスク動作を実装するには多くの方法があり、どれが最適かがわからない場合は、実際にいくつかのテスト ケースを作成し、プロファイリングを行う必要がある可能性があります。これは難しくありません。単純にマルチコア システムを使用しようとしている場合は、一般に最新バージョンの .NET を使用すると非常に簡単です。マルチコア用にセットアップしても、適切な構成を使用してシングル コアに戻すこともできます。

たとえば、async/await パターンは、#ifdef(検索と置換ツールを使用して) すべての await キーワードを使用または削除することで、簡単に同期的に実行できます。ループは、直接または変更することにより、Parallel.For通常のループに簡単に変換できます。タスクは簡単に同期的に実行できます。forMaxDegreeOfParallelism

透過性を高めたい場合は、T4 などの前処理スクリプトを使用できます。

于 2012-10-17T05:54:59.250 に答える
2

一般に、シングル コアでマルチ スレッドを実行すると、スレッド間にコンテキスト スイッチがあるため遅くなります。

次の図が違いを説明していると思います。

コンテキスト スイッチ

図を見るとわかるように、1 回目はマルチタスクで、2 回目はシーケンシャルで、シングル コアで実行されている 4 つのスレッドを参照しています。

マルチタスクでは、すべてのスレッドがシーケンシャル タスクよりも遅く終了することがわかります。

あなたの特定のケースでは、おそらく同じではないでしょう.WCF呼び出しが関係しているので、@Guffaは彼の答えで正しいと思います.

于 2012-08-27T10:57:19.397 に答える