6.8. Time Your Code
Timing code isn't
difficult. You can use the DateTime.Now property
to capture the current date and time down to the millisecond.
However, this approach isn't perfect. Constructing
the DateTime object takes a short time, and that
little bit of latency can skew the time you record for short
operations. Serious profilers need a better approach, one that uses
low-level systems calls and has no latency.
Note: The new Stopwatch class allows you to track how fast your
code executes with unparalleled precision.
6.8.1. How do I do that?
In .NET 2.0, the best way to time your code is to use the new
Stopwatch class in the
System.Diagnostics namespace. The
Stopwatch class is refreshingly simple to use. All
you need to do is create an instance and call the
Start( ) method. When
you're finished, call Stop( ).Example 6-8 shows a simple test that times how long
a loop takes to finish. The elapsed time is then displayed in several
different ways, with different degrees of precision.
Example 6-8. Timing a loop
Module TimeCodeHere's the output you'll see:
Sub Main( )
Dim Watch As New Stopwatch( )
Watch.Start( )
' Delay for a while.
For i As Integer = 1 To 1000000000
Next
Watch.Stop( )
' Report the elasped time.
Console.WriteLine("Milliseconds " & Watch.ElapsedMilliseconds)
Console.WriteLine("Ticks: " & Watch.ElapsedTicks)
Console.WriteLine("Frequency: " & Stopwatch.Frequency)
Console.WriteLine("Whole Seconds: " & Watch.Elapsed.Seconds)
Console.WriteLine("Seconds (from TimeSpan): " & Watch.Elapsed.TotalSeconds)
Console.WriteLine("Seconds (most precise): " & _
Watch.ElapsedTicks / Stopwatch.Frequency)
End Sub
End Module
Milliseconds 10078You can retrieve the elapsed time in milliseconds from the
Ticks: 36075265
Frequency: 3579545
Whole Seconds: 10
Seconds (from TimeSpan): 10.0781705
Seconds (most precise): 10.078170549609
Stopwatch.ElapsedMilliseconds
property. (One second is 1,000 milliseconds.) The
ElapsedMilliseconds property returns a 64-bit
integer (a Long), making it extremely precise. If
it's more useful to retrieve the time as a number of
seconds or minutes, use the Stopwatch.Elapsed
property instead, which returns a TimeSpan object.On the other hand, if you want the greatest possible precision,
retrieve the number of ticks that have elapsed from the
Stopwatch.ElapsedTicks
property. Stopwatch ticks have a special
meaning. When you use the TimeSpan or
DateTime object, a tick represents 0.0001 of a
millisecond. In the case of a Stopwatch, however,
ticks represent the smallest measurable increment of time, and depend
on the speed of the CPU. To convert Stopwatch
ticks to seconds, divide ElapsedTicks by
Frequency.
6.8.2. What about...
...pausing a timer? If you want to record the total time taken to
complete multiple operations, you can use Stop( )
to pause a timer and Start( ) to resume it later.
You can then read the total time taken for all the operations you
timed from the Elasped and
ElaspedMilliseconds properties.You can also run multiple timers at once. All you need to do is
create one Stopwatch object for each distinct
timer you want to use.