1

リストを作成するためにネストされた foreach を実行する必要があるシナリオがあります。私が行うことの擬似コードは以下のとおりです

foreach(var x in list)           (ForEach1)
   get m // List<string>
   foreach(var k in m)           (ForEach2)
     get t // List<string>
        foreach(var o in t)      (ForEach3)
          // Do some work. and add output to a list
          // which is defined before first for each

ただし、Foreach2 と Foreach3 で (Perforce コマンドを実行して Perforce から) 外部システムからデータを取得するため、このコードの実行速度は非常に遅く、速度を上げる必要があります。

Parallel.ForEach を使用して、ForEach1 または ForEach2 を並列で実行しようとしました。私のテストでは、パフォーマンスが大幅に向上しましたが、不正確な結果が得られました。

  • このコードを foreach ステートメントで実行すると、生成されるリストには 625 個の項目があります (これは正しいです)。
  • ForEach1 に Parallel.ForEach を使用すると、リストに 325 が追加されますが、これは予想よりもかなり下です。
  • 最後に、ForEach2 に Parallel.ForEach を使用すると、リストに 605 個の項目が追加されますが、まだ 20 個が不足しています。

何が間違っているのか、何が欠けているのかわかりません。Parallel foreach または for を使用する際に考慮すべきことは何ですか?

誰かが私を整理するのを手伝ってくれますか? パフォーマンスを改善するための他の提案をいただければ幸いです

ありがとう

4

1 に答える 1

1

あなたの「取得」操作が何であるかはわかりませんが、クロージャーの問題でもある可能性があります。ネットで検索できます。たとえば、 foreach 識別子とクロージャーhttp://www.codethinked.com/c-closures-explained

于 2012-11-13T12:37:40.050 に答える