Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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); 
like image 531
David Basarab Avatar asked Aug 26 '08 17:08

David Basarab


2 Answers

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.

like image 55
Markus Olsson Avatar answered Sep 19 '22 19:09

Markus Olsson


If you want something quick and dirty I would suggest using Stopwatch instead for a greater degree of precision.

Stopwatch sw = new Stopwatch(); sw.Start(); // Do Work sw.Stop();  Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds); 

Alternatively, if you need something a little more sophisticated you should probably consider using a 3rd party profiler such as ANTS.

like image 36
mmcdole Avatar answered Sep 22 '22 19:09

mmcdole