2016-04-10 6 views
0

だから、私はListで同じ要素のパフォーマンスに対して作成され、コードなぜ私のElapsedMillisecondsは常にここでゼロですか?

 Stopwatch Watch = new Stopwatch(); 
     long tList = 0, tHset = 0; // ms 
     foreach (string Str in Copy) 
     { 
      // measure time to look up string in ordinary list 
      Watch.Start(); 
      if (ListVersion.Contains(Str)) { } 
      Watch.Stop(); 
      tList += Watch.ElapsedMilliseconds; 
      // now measure time to look up same string in my hash set 
      Watch.Reset(); 
      Watch.Start(); 
      if (this.Contains(Str)) { } 
      Watch.Stop(); 
      tHset += Watch.ElapsedMilliseconds; 
      Watch.Reset(); 
     } 
     int n = Copy.Count; 
     Console.WriteLine("Average milliseconds to look up in List: {0}", tList/n); 
     Console.WriteLine("Average milliseconds to look up in hashset: {0}", tHset/n); 

の次のブロックで、それは両方のための0をoutputingされたハッシュセットのパフォーマンスを測定しようとしています。これがなぜなのか?関連するドキュメント:https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch(v=vs.110).aspx

+2

の小数部を持つことになります

Watch.Elapsed.TotalMilliseconds 

この道を操作が速すぎるため、このようなパフォーマンスを測定すべきではありません。 –

答えて

3

これは、操作がStapwatchの精度よりも速いからです。代わりに別々のグループを測定Containsコールの各測定

:あなたが見ることができるように

Stopwatch Watch = new Stopwatch(); 
long tList = 0, tHset = 0; // ms 

// measure time to look up string in ordinary list 
Watch.Start(); 
foreach (string Str in Copy) 
{ 
    if (ListVersion.Contains(Str)) { } 
} 
Watch.Stop(); 
tList = Watch.ElapsedMilliseconds; 
// now measure time to look up same string in my hash set 
Watch.Reset(); 
Watch.Start(); 
foreach (string Str in Copy) 
{ 
    if (this.Contains(Str)) { } 
} 
Watch.Stop(); 
tHset = Watch.ElapsedMilliseconds; 

Console.WriteLine("Total milliseconds to look up in List: {0}", tList); 
Console.WriteLine("Total milliseconds to look up in hashset: {0}", tHset); 

は、私はまた、代わりに平均で費やした時間の合計を印刷するようにコードを変更しました。操作が非常に高速であるため、通常は平均ではなくY単位の操作で表示されます。例えば。 100万回のルックアップごとに40ms。

また、リリースモードでは、実際には何もしないため、コードの一部が最適化される可能性があります。 Containsがtrueを返す要素の数を数え、その数値を最後に出力することを検討してください。それは、代わりに行うのよう

+0

ハァッか。私のコンパイラは、もし私の 'if'文がプログラム内で何も成し遂げられないと仮定すればばかげているでしょう。 – user6048670

+2

@ user6048670しかしあなたのifは何もしません。コンパイラがそれを認識すれば、どのように愚かなのでしょうか? – Paparazzi

+0

コンテナの 'Contains'メソッドの呼び出しに副作用がないことを理解するには、非常にスマートなコンパイラが必要です。私は、アセンブリのメタデータに、コンパイラにそのようなことを伝えるのに十分な情報が含まれているかどうかは疑問です。 –

0

あなたはあなたのコードを維持することができます

Watch.ElapsedMilliseconds 

あなたがこれを行う:あなたがいるので、ミリ秒

関連する問題