0

以前は小さい (より) データのセットを使用していたレガシー アプリがあります。

現在、より大きなデータ セットで実行できるように拡張しています (常にうまく機能します)。

これで、このコードができました。 sValues2100 万 (はい) のアイテムのリストです。sProcessedStatusは、それを使用するかどうか (つまり、-1 または -2 ではない) を示す一致リストです。使用する場合は、それらを に追加しますgroupSourceVals。ただし、一意の値のみを追加するため、indexOf()チェックします。

for (int p = 0; p < sValues.Count; p++)
{
  int currentProcessed = sProcessedStatus[p];
  if ((!(currentProcessed == -1)) && (!(currentProcessed == -2)))
  {
    if (groupSourceVals.IndexOf(sValues[p]) == -1)
    {
      groupSourceVals.Add(sValues[p]);
    }
  }
  else
  {
    Console.WriteLine("Dropping non-processed value " + sValues[p]);
  }
}

ただし、64 ビットのクアッドコア マシンでは、これは数日経ってもまだ実行されていました。吸盤をマルチスレッド化する以外に、私が見逃している高速化に関する理論はありますか? IndexOf は非常に遅く、より良い代替手段はありますか?

4

1 に答える 1

8

HashSet<T>.Contains高速な O(1) 存在チェックに使用します。のみを使用するHashSetか、両方ListHashSet維持して同期を維持します。

于 2012-11-27T19:24:58.617 に答える