How long does my code take to run?

2019-03-19 17:27发布

问题:

How can I find out how much time my C# code takes to run?

回答1:

Check out the Stopwatch class:

Stopwatch sw = new Stopwatch();
sw.Start();

// your code here

sw.Stop();
TimeSpan elapsedTime = sw.Elapsed;


回答2:

The Stopwatch class offers high-precision timing in .NET. It is capable of measuring time with sensitivity of around 100s of nanoseconds (fractions of milliseconds). To get the exact resolution, read the value of Stopwatch.Frequency.

var timer = System.Diagnostics.Stopwatch.StartNew();
// Run code here.
var elapsed = timer.ElapsedMilliseconds.

Also, be sure to run your code repeatedly (as many times as is feasible) to get a better average time, as well as to reduce the effects of fluctuations in CPU load.



回答3:

As others have said, the Stopwatch class is good for the simple timing side of things. Other bits to bear in mind though:

  • Your code may generate objects which will need to be garbage collected after you've stopped the stopwatch
  • Conversely your timing may include other objects being garbage collected even if they have nothing to do with your code
  • If you start timing before you run your method for the first time, it will include JIT time
  • If you take a very short time, that leads to very unpredictable results - for benchmarking I tend to prefer running code for many seconds, to account for the app being interrupted by other processes etc.

If you're interested in benchmarking, I have the MiniBench project which I must get round to working on again at some point - it's not quite where I want it to end up, but it's a start. I talk more about what I want to achieve with it in this blog post.



回答4:

Check out the Stopwatch class.



回答5:

I recommend using a profiling tool such as ANTS to test the speed of your application and find slow code. This will allow you to do a line-by-line test of execution times.



回答6:

If you want simple, just put an N-iteration loop around it and use StopWatch (or just a wristwatch) and divide by N. For example, if you want microseconds, let N = 1000000. If you're worried about the overhead of the loop, just unroll it by a factor of 10.