2012-09-27 14 views
15

私は現在、マルチコアアーキテクチャで並列性を最適化しているコードをいくつか持っています。私のクラスの1つでは、ネストされたループforeachが見つかりました。基本的に、外側のループはNetworkInterfaceオブジェクトの配列を反復します。内部ループは、ネットワークがIPアドレスをインターフェースしていても反復します。入れ子になったParallel.ForEachループ

私は考えている、入れ子になっているParallel.ForEachループは必ず良いアイデアですか?この記事(Nested Parallel.ForEach Loops on the same list?)を読んだ後、私は効率と並列設計の点でどこに適用されるのかまだ分かりません。この例では、両方のループがそのリスト上で操作を実行しているリストに約Parallel.Foreachのステートメントが適用されています。私の例では

、ループは私は、必要がある別のことをやって、そうされています

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

Stopwatchを使用してソリューションをテストできますか?それは価値があるかどうかを知るでしょう。 – mike00

答えて

19

Parallel.ForEachは必ずしも並列に実行されるとは限りません。したがって、実行環境に並列でループを実行するCPUパワーがない場合、実行環境は実行しません。

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

実際は実行環境によって異なります。テスト環境が本番環境に十分似ている場合は、タイミングテストを実行してから、何をすべきかを判断できます。不確かな場合は、テスト;-)

幸運を祈る!

+0

もっと同意できませんでした。はい、Parallel.Foreachの背後にあるスケジューラは別のスレッドを生成できませんが、科学的データをバックアップすることなく、スレッドやスケジューラのオーバーヘッドが大幅に増えています。 –

+2

@MAfifi:私の答えをもう一度読んでください。 –

+0

良い答え;) –

3

答えは、それに依存します。

  1. あなたはいったんそれを持っていたら、あなたはIPアドレスで何をしていますか?
  2. 各ステップにはどのくらい時間がかかりますか?

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

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

+2

スレッドは作成するのに費用がかかります。なぜなら、 'Parallel.ForEach()'が 'ThreadPool'を使用するのはまさにそのため、新しいスレッドを作成することは問題にならないでしょう。 – svick

関連する問題