2

特定の属性を含むメモリ内のいくつかのxml内の要素の数を検出する怠惰なlinqクエリがあります。さまざまな長さのxmlについて、そのクエリを列挙するのにかかる時間の長さを評価したいと思います。

これを行うために、私は最初に.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(.Count()から)

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(.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)
4

2 に答える 2

3

を使用する際の問題var test = nodes.Count();は、基になるコレクション(存在する場合)がプロパティIList<T>を持つ実装をしている可能性があることCountです。

最適化として、そのプロパティを呼び出すことができ、コレクションのサイズに関係なく、ほぼ一定の時間が得られます。

実際に繰り返す代わりに、ToList() または Count()実際に繰り返すことを検討してください。

foreach(var item in nodes){}

-では何もしていないことに注意してくださいitem。これは最小限のオーバーヘッドで反復するだけです。

于 2012-05-02T10:46:01.443 に答える
1

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

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

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

于 2012-05-02T10:54:26.257 に答える