2016-04-10 3 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 операций, а не в среднем. Например. 40 мс на 10 млн поисков.

Кроме того, возможно, что в режиме Release части вашего кода будут оптимизированы, потому что на самом деле он ничего не делает. Рассмотрим подсчет количества элементов, для которых Contains возвращает true и печатает этот номер в конце.

+0

А? Мой компилятор был бы глуп, если бы предполагал, что мои операторы 'if' ничего не выполняют в программе – user6048670

+2

@ user6048670 Но ваш if ничего не делает. Как компилятор глуп, если он это признает? – Paparazzi

+0

Это должен быть очень умный компилятор, чтобы понять, что вызов метода контейнера Contains не имеет побочных эффектов. Я сомневаюсь, что метаданные сборки содержат достаточно информации, чтобы сообщить компилятору что-то вроде этого. –

0

Вы можете оставить свой код, как это и вместо того, чтобы делать:

Watch.ElapsedMilliseconds 

Вы можете сделать это:

Watch.Elapsed.TotalMilliseconds 

Таким образом, вы будете иметь дробную часть миллисекунды

Смежные вопросы