2016-04-10 62 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); 

以下塊是outputing 0兩種。任何想法爲什麼這是?相關文檔:https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch(v=vs.110).aspx

+2

因爲操作太快,你不應該像這樣測量性能。 –

回答

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); 

正如你所看到的,我也改變了代碼打印花費,而不是平均總時間。有了操作,如此快速的性能通常以Xs每Y操作而不是平均值表示。例如。每千萬次查找40ms。

另外,在發佈模式中,部分代碼可能會被優化掉,因爲它實際上並沒有做任何事情。考慮計算Contains返回true的元素的數量,並在最後打印該數字。

+0

咦?如果我的編譯器假定我的'if'語句在程序中沒有完成任何操作 – user6048670

+2

@ user6048670,那麼我的編譯器會很愚蠢。但是你的if不做任何事情。如果它認識到編譯器是如何愚蠢的? – Paparazzi

+0

它必須是一個非常聰明的編譯器,以瞭解對容器的「Contains」方法的調用沒有副作用。我懷疑程序集元數據包含足夠的信息來告訴編譯器。 –

0

你可以把你的代碼,因爲它是和而不是做:

Watch.ElapsedMilliseconds 

你這樣做:

Watch.Elapsed.TotalMilliseconds 

這種方式,您將有毫秒的小數部分