Высокоточные замеры времени в С# средствами .NET

суббота, 22 ноября 2008, Роман Калита

Всем рано или поздно приходится выполнять какие-либо замеры времени, в основном время выполнения операций. Все ничего если операции занимают достаточно много времени, тогда точности в милисекундах вполне достаточно и можно юзать нечто вроде Environment.TickCount или DateTime.Now. Но прозводятся замеры времени выполнения небольшых оперций необходимо использовать более высокую точность.

Было время что лично мне не было известно как сделать замеры времени с точностью больше чем в мс, а хотя бы с долями миллисекунд, средставми дотНЕТа. Я юзал тогда функции наподобии:

  1. [DllImport("KERNEL32")]
  2. private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
  3.  
  4. [DllImport("Kernel32.dll")]
  5. private static extern bool QueryPerformanceFrequency(out long lpFrequency);

Но импортировать функции из АПИ не всегда удобно, да и всегда хочется в managed code делать все методами .NET.

Так вот оказывается в .NET еще с версии 2.0 существует такой класс как StopWatch из namespace System.Diagnosics. Основной целью которого являются высокоточные замеры времени.

  1. System.Diagnostics.Stopwatch watch = new Stopwatch();
  2. watch.Start();
  3.  
  4. int j = 0;
  5. for (int i = 0; i < 100; i++)
  6.   j++;
  7.        
  8. Console.WriteLine("\n");
  9. watch.Stop();
  10.  
  11. Console.WriteLine(watch.Elapsed.TotalMilliseconds);
  12. Console.ReadLine();

Вывод - 1,9301 мс. Да но если мы хотим помертять время более точно в микросекундах или даже в нано, тогда можно вычислить более точное значение вручную:

double timens1 = watch.ElapsedTicks * 1000000f / Stopwatch.Frequency;

и получим результат: 1930.13357842966 мкс

StopWatch коммулятивный таймер, так что для нескольких замеров нужно вызывать Reset для сброса значений.

Так что теперь стоит забыть об импортировании perfomance counters.


Ищите нас в интернетах!

Комментарии

Свежие вакансии