2012-02-22 14 views
1

私はC#4.0スレッドループを使用するための良い措置を見つけることを試みています。たとえば、幅/高さが8/5の2つの配列、つまり多次元の配列がそれぞれ40個の要素であるとします。私は、現時点で最適化していたコードの一部を通じC#4.0マルチスレッドループ:いつ使用するか、使用しない場合は?

、私はそのような状況accross私はちょうど要素によって(ネストされたループを使用して)、そのような二つのテーブル

はです要素をmultiplingています数回、使用する価値れてきますそのようなもののための4.0のスレッドループ?そうでない場合は、それを使用するかどうかについての良い練習/サイズ見積もりは何ですか?

敬具、ネストされたループは仕事とデータの独立したプールにを分離されたマルチスレッドと

+1

C#(a *言語*)には「スレッドループ」などの機能はありません。あなたが話していることの例を挙げることはできますか? 'Parallel.ForEach'、おそらく? –

+1

試行錯誤の結果、測定が並行して高速に実行されることがわかります。真剣にも、各要素について何をしているのかわからないので、信頼性をもって回答する方法はありません。 –

答えて

5

挑戦。あなたのループが配列を進めるときに配列を変更すると、複数のスレッドに分割したときにうまく動作しません。入力データが読み取り専用で、ループの出力が別のデータ構造になるようにループを設定している場合は、マルチスレッドの可能性があります。読み取り専用の入力+ローカライズされた出力は、マルチスレッドに適しています。

各ループ反復でどれだけの作業が行われているかという問題もあります。反復処理がほとんど行われないループをマルチスレッド化することによるメリットはありません。小さな高速ループでのウォールクロック時間のほとんどは、作業自体ではなく、ループ管理に費やされます。ループをマルチスレッド化すると、ループ管理オーバーヘッドが増加します。あなたのループが反復ごとに些細な作業をしている場合は、マルチスレッドの利点を見るチャンスが増えます。

繰り返し処理ごとにファイルI/Oなどのブロック操作が含まれている場合は、ループをマルチスレッド化すると処理が改善されると考えられます。多くの場合、ファイルI/Oバウンドループをマルチスレッド化すると状況が悪化します。これらのファイルI/Oのもう一方の端にあるハードウェアデバイスは、通常、物理的な読み取り/書き込みヘッドをそれ以上速く動かすことができないため、同時に多くのことを行うように求めても何の効果もありません。ループをマルチスレッド化する前に、非同期ファイルI/Oを使用して調査する方がよいでしょう。

最後に、マルチスレッドが役立つかもしれない推測に基づいて、これを実行しないでください。マルチスレッドとそれ以降のコードのパフォーマンスを測定します。マルチスレッドが大幅に改善されている状況が見つからない場合は、それをしないでください。時にはわずかな改善が得られるだけの余計な努力とリスクはありません。

関連する問題