24

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

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

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

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

2 に答える 2

32

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

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

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

幸運を!

于 2012-09-27T09:44:32.277 に答える
4

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

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

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

StopWatchこれらの質問に答えるのに役立ちます。

于 2012-09-27T09:44:20.247 に答える