Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use AverageTimer32 and AverageBase performance counters with System.Diagnostics.Stopwatch?

Tags:

When I execute the following program and look at the performance counter the results don't make sense to me. The average value is zero and the min/max values are ~0.4 when I would expect ~0.1 or ~100.

What is my problem?

Code

class Program {     const string CategoryName = "____Test Category";     const string CounterName = "Average Operation Time";     const string BaseCounterName = "Average Operation Time Base";      static void Main(string[] args)     {         if (PerformanceCounterCategory.Exists(CategoryName))             PerformanceCounterCategory.Delete(CategoryName);          var counterDataCollection = new CounterCreationDataCollection();          var avgOpTimeCounter = new CounterCreationData()         {             CounterName = CounterName,             CounterHelp = "Average Operation Time Help",             CounterType = PerformanceCounterType.AverageTimer32         };         counterDataCollection.Add(avgOpTimeCounter);          var avgOpTimeBaseCounter = new CounterCreationData()         {             CounterName = BaseCounterName,             CounterHelp = "Average Operation Time Base Help",             CounterType = PerformanceCounterType.AverageBase         };         counterDataCollection.Add(avgOpTimeBaseCounter);          PerformanceCounterCategory.Create(CategoryName, "Test Perf Counters", PerformanceCounterCategoryType.SingleInstance, counterDataCollection);          var counter = new PerformanceCounter(CategoryName, CounterName, false);         var baseCounter = new PerformanceCounter(CategoryName, BaseCounterName, false);          for (int i = 0; i < 500; i++)         {             var sw = Stopwatch.StartNew();             Thread.Sleep(100);             sw.Stop();              Console.WriteLine(string.Format("t({0}) ms({1})", sw.Elapsed.Ticks, sw.Elapsed.TotalMilliseconds));             counter.IncrementBy(sw.Elapsed.Ticks);             baseCounter.Increment();         }          Console.Read();     } } 

Performance Counter Screenshot Performance Counter Screenshot http://friendfeed-media.com/50028bb6a0016931a3af5122774b56f93741bb5c

like image 607
Eric Schoonover Avatar asked Oct 10 '09 06:10

Eric Schoonover


1 Answers

The System.Diagnostics API contains a pretty subtle source of great confusion: System.Diagnostics 'ticks' are not the same as DateTime or TimeSpan 'ticks'!

If you use StopWatch.ElapsedTicks instead of StopWatch.Elapsed.Ticks, it should work.

The documentation contains more information about this.

like image 142
Mark Seemann Avatar answered Oct 25 '22 02:10

Mark Seemann