2017-12-22 6 views
0

なぜ、このコードは次のとおりです。速く、このコードよりオーダーされたコレクションが列挙される理由と処理方法

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:反復の時間のみを測定します。私は分別がそれ自身のために時間を必要とすることを知っています。ループ内で起こっている操作は無関係です。

文字通りソートの行をコメントアウトするので、繰り返し時間は小さくなります。それは他のベンチマークではないはずですが、私の現在のアプリケーションではこれが起こり、多分誰かがこのトピックについて私に助言を与えることができるのだろうかと思います。

+0

2番目の例ではforeachループの処理に時間がかかりません。私は時間をリストをソートするために失われると思います。 –

+0

繰り返し速度は同じです。違いはリストの準備であり、もちろんリストの並べ替えはソートしないよりも遅いです。あなたはあなたのデータを( 'LoadCords()'からソートすることはできませんか? –

+2

あなたは順序付けられたコレクションがより遅く列挙しますが、実際に起こるコード内の唯一の場所は '.ToList()'です。実際には*ベンチマーク? – itsme86

答えて

0

ループ内で条件を実行するのではなく、結果をフィルタリングするためにlinqクエリを使用してみてください。

var cords = LoadCords().Where(cord => cord.x >2); 
// Now iterate via linq .ForEach/.Select to do something without if condition. 

さらに、他のデータタイムを使用して提案されています。正確な結果はありません。ストップウォッチを使用してください。

+0

これは無関係ですが、Wh​​ereを使用する前にプロセス全体を遅くする方法でStopwatchは同じ結果を出しています –

関連する問題