なぜ、このコードは次のとおりです。速く、このコードよりオーダーされたコレクションが列挙される理由と処理方法
class Cord : IComparable<Cord>
{
public int X { get; set; }
public int Y { get; set; }
public int CompareTo(Cordother)
{
return this.X.CompareTo(other.X);
}
}
List<Cord> Cords = LoadCords();
stopwatch.Start();
foreach(var cord in Cords)
{
// do something
}
stopwatch.Stop();
数回:
List<Cord> Cords = LoadCords().OrderBy(r=> r.x).ToList();
stopwatch.Start();
foreach(var cord in Cords)
{
// do something
}
stopwatch.Stop();
(数百万レコードを処理している)私のアプリケーションのパフォーマンスを向上させるために私が注文したコレクションを必要としています。また、ListSetのSortSetとSortメソッドを使って、IComparable
を実装しようとしました。いずれにしても、順序付きリストの同じ反復は、変更されていないものよりも多くの時間がかかります。それはなぜですか?ソートされたコレクションを基本的なコレクションと同じくらい効率的に反復するにはどうしたらいいですか?
EDIT:反復の時間のみを測定します。私は分別がそれ自身のために時間を必要とすることを知っています。ループ内で起こっている操作は無関係です。
文字通りソートの行をコメントアウトするので、繰り返し時間は小さくなります。それは他のベンチマークではないはずですが、私の現在のアプリケーションではこれが起こり、多分誰かがこのトピックについて私に助言を与えることができるのだろうかと思います。
2番目の例ではforeachループの処理に時間がかかりません。私は時間をリストをソートするために失われると思います。 –
繰り返し速度は同じです。違いはリストの準備であり、もちろんリストの並べ替えはソートしないよりも遅いです。あなたはあなたのデータを( 'LoadCords()'からソートすることはできませんか? –
あなたは順序付けられたコレクションがより遅く列挙しますが、実際に起こるコード内の唯一の場所は '.ToList()'です。実際には*ベンチマーク? – itsme86