2013-06-04 18 views
12

私はオブジェクトのそれぞれを並列に処理したいという巨大なコレクションを持っています。同期を同じに行うには、通常、単純な「foreach」が必要です。Parallel.ForEachとAsParallel()。ForAll

私のシナリオでは、Parallel.ForEachまたはMyCollection.AsParallel()、ForAll()のいずれかを使用してください。

あなたは、もう一方を使うことのメリットを私に見せてもらえますか?

+1

これは関連しているようです。 http://stackoverflow.com/questions/2270097/does-parallel-foreach-require-asparallel?rq=1 – Patrick

+1

[.AsParallel()。ForAllまたはParallel.ForEachパフォーマンスの問題を使用してタスクを並列化する](http: //stackoverflow.com/questions/8415998/parallelizing-a-task-using-asparallel-forall-or-parallel-foreach-performance) – Patrick

答えて

17

私が見ているのは、foreachを並列化するだけであれば、その並列バージョンはParallel.ForEach()です。

ParallelEnumerable.ForAll()は、LINQクエリの後にforeachが続き、両方を並列化したい場合に使用します。ですから、AsParallel()を追加してLINQクエリを並列化し、次にForAll()に変更してforeachを並列化するとします。

5

両方とも時間をとり、勝者を選んでください。

私はParallel.ForEachが最も快適な並列シナリオでより良いパフォーマンスを発揮することを発見しました。より高度なワークバランシングモデルを使用しているようです。 PLINQは主にクエリの並列化を目的としています。

-2

AsParallel()、AsOrdered()で要素を並べ替えることができます。 Parallel.ForEachの注文はすぐにはできません。

1

私の2セント:

ForAllを使用すると、WithDegreeOfParallelism拡張メソッドを使用して並列処理の所望のレベルを指定することができます。

ForEachでは、最大レベルを制限することができます。

基本的には、ForAllにもっと多くのスレッドを使用させることができます。

関連する問題