65.9K
CodeProject is changing. Read more.
Home

Simple Way to Measure Execution Time by Stopwatch

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (11 votes)

Jun 22, 2015

CPOL

2 min read

viewsIcon

22297

Easy way to measure execution time of the code block

Introduction

There are plenty of articles on how to measure execution time by stopwatch. Most of them are very complex. I will try to introduce my way to do it. I think that it will be the shortest one because like all programmers, I am lazy. ;)

I was frustrated when I tried to measure execution time of some functions. Problem was that every time I did try to do it, it was always the same code and it was always copy and paste. It's fine until you look at your code and on one page, you can see plenty of this:

stopwatch.Start();
SpecialFunctionToMeasure();
stopwatch.Stop()

And the problem was if your function triggers an exception which you didn't expect - like always when you think that everything is ok. :) If this happens, you will try to make code like this:

stopwatch.Start();
try
{
    SpecialFunctionToMeasure();
}
catch(....)
{
    ....
}
finally
{
    stopwatch.Stop();
}

It looks horrible. :) Isn't it ?

Solution

To understand my way of measuring time of execution, you have to have basic knowledge about C#, but I will try to explain in an easy way those few lines of code. My code for the class is as given below:

    public class TimeMeasurementBlock : IDisposable
    {
        public Stopwatch Stopwatch { get; private set; }

        public TimeMeasurementBlock(Stopwatch stopwatch)
        {
            Stopwatch = stopwatch;
            if (Stopwatch != null)
                Stopwatch.Start();
        }

        #region Implementation of IDisposable

        public void Dispose()
        {
            if (Stopwatch != null)
                Stopwatch.Stop();
        }

        #endregion
    }

As you can see, the code is simple and should not disturb measurements. Of course, every additional code will disturb measurements, but I hope we are not making code for HFT. :)

You can skip public property if you wish. I put it because I am using it inside my code and it looks nice. :) Also, you can skip part with checking if Stopwatch is null if you are sure of what you are doing and to save few ticks. :)

Updated code to use new functionality of the C#:

 public class TimeMeasurementBlock : IDisposable 
 { 
     public Stopwatch Stopwatch { get; private set; } 
    
     public TimeMeasurementBlock(Stopwatch stopwatch) 
     { 
         Stopwatch = stopwatch; 
         Stopwatch?.Start(); 
     } 


     #region Implementation of IDisposable 

     public void Dispose() 
     { 
         Stopwatch?.Stop(); 
     } 

     #endregion 
 }

Using the Code

It is very simple to use this class in your code. The code below should put light in this dark region... :)

Stopwatch stopwatch = new Stopwatch();
using (var timeBlock = new TimeMeasurementBlock(stopwatch))
{
...
}

...or if you don't need to access class inside block:

Stopwatch stopwatch = new Stopwatch();
using (new TimeMeasurementBlock(stopwatch))
{
...
}

As you probably know, "using" guarantees you that will call Dispose function at the end of the block even if will be exception inside. I think that this is the simplest solution for measuring execution time. Life is already very complicated so we don't have to complicate our source code. :)