Search code examples
c#.netperformancedatetimetimer

Is DateTime.Now the best way to measure a function's performance?


I need to find a bottleneck and need to accurately as possible measure time.

Is the following code snippet the best way to measure the performance?

DateTime startTime = DateTime.Now;

// Some execution process

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);

Solution

  • No, it's not. Use the Stopwatch (in System.Diagnostics)

    Stopwatch sw = Stopwatch.StartNew();
    PerformWork();
    sw.Stop();
    
    Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
    

    Stopwatch automatically checks for the existence of high-precision timers.

    It is worth mentioning that DateTime.Now often is quite a bit slower than DateTime.UtcNow due to the work that has to be done with timezones, DST and such.

    DateTime.UtcNow typically has a resolution of 15 ms. See John Chapman's blog post about DateTime.Now precision for a great summary.

    Interesting trivia: The stopwatch falls back on DateTime.UtcNow if your hardware doesn't support a high frequency counter. You can check to see if Stopwatch uses hardware to achieve high precision by looking at the static field Stopwatch.IsHighResolution.