web-dev-qa-db-ja.com

ネストされたParallel.ForEachループ

マルチコアアーキテクチャでの同時実行性のために現在最適化しているコードがあります。私のクラスの1つで、ネストされたforeachループを見つけました。基本的に、外側のループはNetworkInterfaceオブジェクトの配列を反復処理します。内部ループは、ネットワークインターフェイスのIPアドレスを反復処理します。

ネストされたParallel.ForEachループは必ず良いアイデアですか?この記事を読んだ後( 同じリストにネストされたParallel.ForEachループ? )効率と並列設計の観点から何がどこに適用されるのかまだわかりません。この例では、約Parallel.Foreachステートメントは、両方のループがそのリストに対して操作を実行しているリストに適用されます。

私の例では、ループはさまざまなことをしているので、次のようにする必要があります。

  1. ネストされたParallel.ForEachループを使用しますか?
  2. 親ループでParallel.ForEachを使用し、内部ループをそのままにしますか?
23
Matthew Layton

Parallel.ForEachは必ずしも並行して実行されるとは限りません-可能であれば実行するように要求するだけです。したがって、実行環境にループを並列実行するためのCPU能力がない場合、実行環境には実行されません。

ループのアクションが関連していない場合(つまり、それらが独立していて互いに影響を与えていない場合)、内側と外側の両方のループでParallel.ForEachを使用しても問題はありません。

それは本当に実行環境に依存します。テスト環境が本番環境に十分似ている場合は、タイミングテストを実行してから、何をすべきかを判断できます。疑わしい場合は、テストしてください;-)

幸運を!

30
Roy Dictus

答えは、状況によって異なります。

  1. IPアドレスを取得したら、それをどのように処理しますか?
  2. 各ステップにはどのくらい時間がかかりますか?

スレッドは安価ではなく、作成に時間がかかり、メモリが存在します。これらのIPアドレスを使用して計算コストの高い処理を行っておらず、同時アクセスに間違ったタイプのコレクションを使用している場合は、ほぼ確実にアプリケーションの速度が低下します。

StopWatch を使用して、これらの質問に答えてください。

4
M Afifi