2012-03-25 16 views
8

私のコードでParallel.ForEachとPLINQを使用するほど、多くの顔とコードレビューのプッシュバックが得られます。だから私はPLINQを極端に、各LINQステートメントで使用しないように私に理由があるのだろうか?ランタイムは、アプリのパフォーマンスが向上するのではなく実際に低下するほど多くのスレッドを生成する(またはスレッドプールから多くのスレッドを消費する)ようにスマートにできないことがありますか? Parallelライブラリにも同じ質問が当てはまります。.NET 4 Parallel.ForEachとPLINQ:スレッドプールを圧倒してアプリのパフォーマンスを低下させることはできますか?

マルチスレッドを使用するスレッドの安全性とオーバーヘッドに関係することを理解しています。私はまた、すべてが並列化するのに良いとは思いません。私のアプローチを守り、これらの2つの素晴らしいことをあきらめるべきかどうかについて私は疑問に思っています。私の同僚は.NETの機能に頼るのではなくスレッドの制御を自分自身で行うほうがいいと思うからです。

更新:ハードウェアがマルチスレッドの使用に関する前提条件を満たすほど十分に良いと仮定してください。

+0

私はあなたが手作業で設定しない限り、plinqはあなたが持っているコアの数に基づいていくつかのスレッドしか使用しないと信じています –

+0

@LukeMcGregor:デフォルトとは何ですか? – Schultz9999

答えて

4

それはすべてが二つのものにダウンしています:

  1. は、コレクションを分割し、定期的なforeachと比較して、パフォーマンスゲインよりも大きいスレッドを同期するために必要な余分な作業ですか?

  2. すべてのスレッドはボトルネックになる共有リソースを使用しますか?

二例の例は、Linq to Sql文の結果の上にParallel.ForEachを行っています。その場合、DBからの結果が非常に遅い場合、各スレッドは実際に何かを実行するよりも、データが処理されるのを待つ時間が長くなります。

を参照してください:あなたは.WithDegreeOfParallelism(N)を使用できるスレッドhttp://msdn.microsoft.com/en-us/library/dd997392.aspx

+0

私は1000人のコンシューマーが、何らかの計算アクション(dbコール、他のリソースを待つことなく)を適用する必要があると言います。その結果、同期コレクションに保存します(ペナルティかもしれません)。だから、Parallel.ForEach(消費者、c => ...)と書くと、単純なforeachより速くなることが期待されます。実際のパフォーマンスプロファイリングがなければ、私の希望が正当化されているかどうかは分かりません。しかし、素朴な推論から、このアプローチは正しいと思われる。 – Schultz9999

+0

それは正しいようです。しかし、再び、各顧客の計算作業をやめなければならなくなります。たとえば、単純な算術計算では、並列性を正当化するには十分ではありません。 – Diego

2

た場合の性能に関する質問に掘るこれを参照してください。深い、私は最良のことは、測定、測定、測定することだと思います。誰かがPLINKが素晴らしいと回答しても、アプリケーションのパフォーマンスを向上させても、プロファイリングで検証することなくそれを信じていますか?一般的な回答が存在する可能性がありますが、あなたの正確なケースでのパフォーマンスを測定するための努力を惜しまないことができます。総合的なパフォーマンスは非常に多くのことに依存しており、あるケースではPLINKが役立ちますが、他のケースではそうではありません。
PLINKでの私の個人的な経験によれば、LINKの各LINQクエリをPLINKに入れた後、負荷が小さい場合は応答時間が改善され、負荷が最大に近づいても差はありません。しかし、私はPLINKが大きな負荷のもとで総合的なパフォーマンスを傷つけるケースを想像することができます。あなた自身の特定の事件のためにそれをチェックしなければならない。
さて、あなたが正しい道を歩いていることを他の人に納得させたい場合は、測定結果よりも他に何が良いでしょうか?

関連する問題