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);
If you want something quick and dirty I would suggest using Stopwatch instead for a greater degree of precision.
Alternatively, if you need something a little more sophisticated you should probably consider using a 3rd party profiler such as ANTS.
Visual Studio Team System has some features that may help with this problem. Essentially you can write unit tests and mix them in different scenarios to run against your software as part of a stress or load test. This may help to identify areas of code that impact your applications performance the most.
Microsoft' Patterns and Practices group has some guidance in Visual Studio Team System Performance Testing Guidance.
The stopwatch functionality would be better (higher precision). I'd also recommend just downloading one of the popular profilers, though (DotTrace and ANTS are the ones I've used the most... the free trial for DotTrace is fully functional and doesn't nag like some of the others).
I just found a post in Vance Morrison's blog about a CodeTimer class he wrote that makes using
StopWatch
easier and does some neat stuff on the side.No, it's not. Use the Stopwatch (in
System.Diagnostics
)Stopwatch automatically checks for the existence of high-precision timers.
It is worth mentioning that
DateTime.Now
often is quite a bit slower thanDateTime.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.The way I use within my programs is using the StopWatch class as shown here.