2

別のクラスのプロセスに渡す必要のある文字列のリストがあります。速度、効率、並列処理の観点から、2つのアイデアのどちらを使用するのが良いかを知りたいと思います。リストには±10000の文字列が含まれており、スレッドを適切に制限して、一度に実行されるスレッドが約5つになるようにします。

For i as integer = 0 to searchPages.Count - 1
    Parallel.For(0,10,Sub(x)
                        ps.processPage(searchPages.Item(i))
                 End Sub)
Next

タスクファクトリは正常に機能しているようですが、どちらを実装すればよいかわかりません。

For i as integer = 0 to searchPages.Count - 1
    Dim fact as Task=Task.Factory.StartNew(Sub() ps.processPage(searchPages.Item(i)))
    If i = 11 then
           Tasks.Task.WaitAll()
    Endif

Next

どんなアイデアでもありがたいです。

4

2 に答える 2

6

このタイプの純粋なデータ並列処理には、以下を使用することをお勧めしParallel.ForEachます。

Parallel.ForEach(searchPages, Sub(page) ps.processPage(page))

これを5つのスレッドの使用に制限する場合は、 ParallelOptions.MaxDegreeOfParallelismを介して行うことができます。

Dim po as New ParallelOptions
po.MaxDegreeOfParallelism = 5
Parallel.ForEach(searchPages, po, Sub(page) ps.processPage(page))

Task.Factory.StartNewクラス内のパーティショニングはParallelタスクを再利用し、過剰なスケジューリングの発生を防ぐため、これはよりもオーバーヘッドが少なくなります。また、処理の一部に現在のスレッドを強制的に待機状態にする代わりに使用します。これにより、関連するオーバーヘッドの合計も削減されます。

于 2012-03-22T17:29:28.167 に答える
2

私があなたなら、使用されているスレッドの数についてはあまり心配しません(問題があることを示すことができない限り)。を使用してParallel.ForEach、ランタイムに最適なスレッド数を計算させます。

ランタイムによってスレッドがどのように管理されるかについての詳細については、この質問への回答をご覧ください。

于 2012-03-22T17:33:26.623 に答える