の終わりに向かって遅くなりますアイテムの最初の80%は大丈夫です - すべてのCPUコアを使用して非常にいいです。Parallel.ForEachは、私は次の問題を持って反復
反復が終わりに近づいているように見える(約80%私は言うだろう)スレッドの数がコアによってコアを下り始めるのを見て、最後に&最後のアイテムの約5%が2つのコアによってのみ処理されます。したがって、すべてのコアを最後まで使用するように促されると、繰り返しの終わりに向かってかなり遅くなります。
ワークロードはアイテムごとに非常に異なることに注意してください。 1つは1-2秒続くことができ、他の項目は2〜3分かかることがあります。
いずれかのご意見、ご提案は大歓迎です。使用
コード:
var source = myList.ToArray();
var rangePartitioner = Partitioner.Create(0, source.Lenght);
using (SqlConnection connection =new SqlConnection(cnStr))
{
connection.Open();
try
(
Parallel.ForEach(rangePartitioner, (range, loopState) =>
{
for(int i = range.Item1; i<range.Item2; i++)
{
CPUIntensiveMethod(source[i]);
}
});
}
catch(AggretateException ae)
{ //Exception cachting}
}
することができこのコードと関係がありますか? *単一の*接続でSQL文を「並列」で実行しようとしていますか?なぜ「並列実行」がSQLパフォーマンスの問題に役立つと思いますか? –
私はマルチスレッドの単一の接続を使用しません。接続はプールされます。スレッドごとに接続を作成する必要があります。 –
CPUコアの数に等しい最大並列度を適用してください: 'Parallel.ForEach(...、ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount} ...)' –