Introduction
Creating an application requires precisely measuring how long specific
operations take to complete. You may be searching for performance bottlenecks
prior to shipping, measuring to ensure that changes do not unexpectedly degrade
performance, or (in my case), testing alternative architectural approaches. You
can use a real stopwatch and measure your application's response time, but
fumbling and other miscues will render about a 1/4 second (0.25) resolution, at
best. The
Tick
count available in VB is more accurate and fumble-proof, and it
has a resolution of about 10ms (0.01).
The Windows Kernel includes a much finer-grained tick counter, which
it exposes in an API call named
QueryPerformanceCounter
. This
timer boasts near microsecond (0.000001) resolution and is easily
callable from VB. The
Stopwatch
class wraps this call, masking
all the sordid details.
Background
Stopwatch merely implements the code described in Microsoft Knowledge Base
article 306978 (10/02) in a easily used class. I can't claim any
originality - the technical details are by Microsoft, and the "stopwatch" class
idea is from an old C++ article I read in 1993 or so (and implemented back then
using mmsystem.dll in Windows 3.1; yikes!).
Using the code
There are two ways to use
Stopwatch
: create a
Stopwatch
instance and tell it to
ReportToConsole
when the code being measured is done; or reuse a single
Stopwatch
instance again and again, saving off elapsed time values each time.
Here's a very simple way to display how long a process takes on the console:
Dim swatch as New Stopwatch("My process")
swatch.ReportToConsole()
You can use the same
Stopwatch
instance repeatedly:
Dim firstResult, secondResult as Double
Dim swatch as New Stopwatch()
firstResult = swatch.ElapsedTime()
swatch.Done()
secondResult = swatch.ElapsedTime()
Console.WriteLine(
"First took {0} seconds; First and Second took {1} seconds.", _
firstResult, secondResult)
swatch.Start()
swatch.Done()
MsgBox("The third thing took " & CStr(swatch.ElapsedTime()) & " seconds.")
Points of Interest
This code also manages to demonstrate how to call the Windows API and how to
define a custom exception class. Microsoft Knowledge Base article 172338 describes how to use
QueryPerformanceCounter
in VB 6 and other environments, and it contributed the
idea of calculating the API call overhead so that it could be subtracted from
the result.