2012-05-02 6 views
2

私は、特定の属性を含むいくつかのxmlのメモリ内の要素の数を検出する、怠惰なlinqクエリを持っています。私は、XMLの長さを変えてそのクエリを列挙するのにかかる時間の長さを評価したいと思います。IEnumerable <T>評価時間の測定方法はありますか?

これを行うために、まず、すべてのアイテムの列挙を引き起こすことがわかっているので、私はまず.ToList()を呼び出すことを検討しました。しかし、これは、すべての項目をある構造から別の構造に移動して.Count()への呼び出しに切り替えるメモリ操作が存在するため、完全な評価時間ではない可能性があると判断しました。

IEnumerable<XMLNode> nodes = "<Some Linq>" 

var watch = new Stopwatch(); 
watch.Restart(); 
var test = nodes.Count(); 
watch.Stop(); 
Console.WriteLine("Enumeration Time: " + watch.ElapsedMilliseconds); 

最初の質問は、これがEnumerableを評価するのにかかる時間を計算する最もよい方法でしょうか?

第2の質問は、実際の評価時間Count()またはToList()をより代表するものでしょうか?

コードの結果がいくつかありますが、反復の間にxmlの新しい部分が追加されます。これは、検索されるxmlが毎回同じ量だけ増加することを意味します。

Resuts

Enumeration Time: 0 (ms) 
Enumeration Time: 0 (ms) 
Enumeration Time: 1 (ms) 
Enumeration Time: 1 (ms) 
Enumeration Time: 2 (ms) 
Enumeration Time: 2 (ms) 
Enumeration Time: 2 (ms) 
Enumeration Time: 3 (ms) 
Enumeration Time: 3 (ms) 
Enumeration Time: 4 (ms) 
Enumeration Time: 4 (ms) 
Enumeration Time: 5 (ms) 
Enumeration Time: 6 (ms) 
Enumeration Time: 6 (ms) 
Enumeration Time: 8 (ms) 
Enumeration Time: 6 (ms) 
Enumeration Time: 15 (ms) 
Enumeration Time: 8 (ms) 
Enumeration Time: 8 (ms) 
Enumeration Time: 9 (ms) 
Enumeration Time: 8 (ms) 
Enumeration Time: 9 (ms) 
Enumeration Time: 10 (ms) 
Enumeration Time: 10 (ms) 
Enumeration Time: 10 (ms) 
Enumeration Time: 27 (ms) 
Enumeration Time: 12 (ms) 
Enumeration Time: 18 (ms) 
Enumeration Time: 20 (ms) 

Resuts(.Count()から)(.ToListから())

Enumeration Time: 1 (ms) 
Enumeration Time: 1 (ms) 
Enumeration Time: 1 (ms) 
Enumeration Time: 2 (ms) 
Enumeration Time: 2 (ms) 
Enumeration Time: 3 (ms) 
Enumeration Time: 3 (ms) 
Enumeration Time: 4 (ms) 
Enumeration Time: 4 (ms) 
Enumeration Time: 5 (ms) 
Enumeration Time: 5 (ms) 
Enumeration Time: 9 (ms) 
Enumeration Time: 14 (ms) 
Enumeration Time: 12 (ms) 
Enumeration Time: 10 (ms) 
Enumeration Time: 8 (ms) 
Enumeration Time: 9 (ms) 
Enumeration Time: 10 (ms) 
Enumeration Time: 13 (ms) 
Enumeration Time: 12 (ms) 
Enumeration Time: 12 (ms) 
Enumeration Time: 16 (ms) 
Enumeration Time: 21 (ms) 
Enumeration Time: 18 (ms) 
Enumeration Time: 15 (ms) 
Enumeration Time: 15 (ms) 
Enumeration Time: 23 (ms) 
Enumeration Time: 15 (ms) 
Enumeration Time: 38 (ms) 
+1

foreachループを使用してLINQ結果を列挙することができます。これは最小限のオーバーヘッドがあるはずです(常にオーバーヘッドがあります)。 – martinstoeckli

答えて

3

var test = nodes.Count();を用いた問題は、根本的なコレクション(IFあるものがあります)Countプロパティを持つIList<T>を実装している可能性があります。

プロパティを呼び出すことができる最適化として、コレクションのサイズに関係なく一定の時間がかかります。 - これはちょうど、最小限のオーバーヘッドで反復されます、我々はitemで何もしていません

foreach(var item in nodes){} 

注:

代わりのToList()またはCount()は実際に反復することを検討してください。

+0

彼がそこで何をしようとしたのか分かりません...あなたは簡単に説明できますか?彼は、繰延実行がienumerableを満たす時間を測定したかったのですか? –

+1

@RoyiNamir - 彼はXMLファイルでLINQを使用しており、さまざまなサイズのコレクションを反復する時間を測定しようとしています。彼は他の可能な変数を最小限に抑えたいと思っています(ToList()は、リストを作成して熱心に返すためにメモリを消費するので、拒否されました。 () 'コレクションに。 – Oded

1

実際にファイルから読み取るようなパフォーマンステストを行うことはできません。

パフォーマンスは、ファイルがディスクキャッシュにあるかどうかによって大きく異なります。テストでは、ファイルはミリ秒前にアクセスされたときに常にキャッシュされますが、実際の状況ではまれにしか発生しないため、全く異なる結果になります。

実際のファイルではなくMemoryStreamからファイルデータを読み取ることで、ファイルデータの解析部分のみをテストできます。しかし、実際のファイルの読み込みは、通常はそれを解析するよりもはるかに時間がかかるため、解析のパフォーマンスは一般的に重要ではありません。

+0

申し訳ありませんが、多分言い換えれば、XMLはこのテストの時点でメモリにあります。質問を編集します。 – Jambobond

関連する問題