2

私は別のクラスのプロセスに渡す必要がある文字列のリストを持っています。 2つのアイディアのどちらが、スピード、効率、並列処理の面でより良いアプローチになるかを知りたい。リストには含まれてい+ - 10000個の文字列を、私は一度だけで実行されている5threadsについて持っているために適切にスレッドを制限したい:parallel.forまたはtask.startnewマルチプロセスで

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 

純粋なデータ並列のこのタイプの

答えて

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)) 

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

2

もし私があなただったら、使用しているスレッドの数についてあまり気にしませんでした(問題がない限り表示しない限り)。 Parallel.ForEachを使用して、ランタイムが最適な数のスレッドを処理できるようにしてください。

this質問に対する回答を見て、スレッドがランタイムによってどのように管理されているかについての詳細を確認してください。

+0

+1早すぎる最適化 – Bronumski

関連する問題