私は単純なwhileループを持っています
IEnumerable<Foo> collection;
while (!bc.IsCompleted)
{
collection = bc.Take();
}
bc はBlockingCollection<IEnumerable<Foo>>
. bc には、9 つの IEnumerable コレクションと合計 260 万の Foo オブジェクトが含まれています。私のマシンでループを実行するには、約 640 ミリ秒かかります。while ループ内の Take() の後に foreach ループを追加するとすぐに、実行にかかる時間が 2400 ミリ秒に爆発します。
foreach(Foo foo in collection)
{
}
個別に設定した List または Foo[] または IEnumerable 内で 260 万を超える要素を反復処理すると、約 54 ミリ秒かかりました。
foreach ループの代わりに、次のようなコレクション変換を追加するだけでも同じことが起こります。
List<Foo> fooList = collection.ToList();
また
Foo[] fooArray = collection.ToArray();
突然、実行に 2000 ミリ秒もかかります。
どうすればいいの?説明や考えられる理由が完全に不足しています。ここで欠けているものを教えてくれる人はいますか? 比較間で BlockingCollection にアクセスする方法を変更していないため、ロック/ブロックによって速度が低下することはありません。
ご意見ありがとうございます。