Stopwatch Class
Updated: August 2008
Provides a set of methods and properties that you can use to accurately measure elapsed time.
Assembly: System (in System.dll)
A Stopwatch instance can measure elapsed time for one interval, or the total of elapsed time across multiple intervals. In a typical Stopwatch scenario, you call the Start method, then eventually call the Stop method, and then you check elapsed time using the Elapsed property.
A Stopwatch instance is either running or stopped; use IsRunning to determine the current state of a Stopwatch. Use Start to begin measuring elapsed time; use Stop to stop measuring elapsed time. Query the elapsed time value through the properties Elapsed, ElapsedMilliseconds, or ElapsedTicks. You can query the elapsed time properties while the instance is running or stopped. The elapsed time properties steadily increase while the Stopwatch is running; they remain constant when the instance is stopped.
By default, the elapsed time value of a Stopwatch instance equals the total of all measured time intervals. Each call to Start begins counting at the cumulative elapsed time; each call to Stop ends the current interval measurement and freezes the cumulative elapsed time value. Use the Reset method to clear the cumulative elapsed time in an existing Stopwatch instance.
The Stopwatch measures elapsed time by counting timer ticks in the underlying timer mechanism. If the installed hardware and operating system support a high-resolution performance counter, then the Stopwatch class uses that counter to measure elapsed time. Otherwise, the Stopwatch class uses the system timer to measure elapsed time. Use the Frequency and IsHighResolution fields to determine the precision and resolution of the Stopwatch timing implementation.
The Stopwatch class assists the manipulation of timing-related performance counters within managed code. Specifically, the Frequency field and GetTimestamp method can be used in place of the unmanaged Win32 APIs QueryPerformanceFrequency and QueryPerformanceCounter.
Note: |
|---|
On a multiprocessor computer, it does not matter which processor the thread runs on. However, because of bugs in the BIOS or the Hardware Abstraction Layer (HAL), you can get different timing results on different processors. To specify processor affinity for a thread, use the ProcessThread.ProcessorAffinity method. |
The following example demonstrates how to use the Stopwatch class to determine the execution time for an application.
Imports System Imports System.Diagnostics Imports System.Threading Class Program Shared Sub Main(ByVal args() As String) Dim stopWatch As New Stopwatch() stopWatch.Start() Thread.Sleep(10000) stopWatch.Stop() ' Get the elapsed time as a TimeSpan value. Dim ts As TimeSpan = stopWatch.Elapsed ' Format and display the TimeSpan value. Dim elapsedTime As String = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10) Console.WriteLine("RunTime " + elapsedTime) End Sub 'Main End Class 'Program
The following example demonstrates the use of the Stopwatch class to calculate performance data.
Imports System Imports System.Diagnostics Class OperationsTimer Public Shared Sub Main() DisplayTimerProperties() Console.WriteLine() Console.WriteLine("Press the Enter key to begin:") Console.ReadLine() Console.WriteLine() TimeOperations() End Sub Public Shared Sub DisplayTimerProperties() ' Display the timer frequency and resolution. If Stopwatch.IsHighResolution Then Console.WriteLine("Operations timed using the system's high-resolution performance counter.") Else Console.WriteLine("Operations timed using the DateTime class.") End If Dim frequency As Long = Stopwatch.Frequency Console.WriteLine(" Timer frequency in ticks per second = {0}", frequency) Dim nanosecPerTick As Long = 1000000000 / frequency Console.WriteLine(" Timer is accurate within {0} nanoseconds", nanosecPerTick) End Sub Private Shared Sub TimeOperations() Dim nanosecPerTick As Long = 1000000000 / Stopwatch.Frequency Const numIterations As Long = 10000 ' Define the operation title names. Dim operationNames As String() = _ {"Operation: Int32.Parse(""0"")", _ "Operation: Int32.TryParse(""0"")", _ "Operation: Int32.Parse(""a"")", _ "Operation: Int32.TryParse(""a"")"} ' Time four different implementations for parsing ' an integer from a string. Dim operation As Integer For operation = 0 To 3 ' Define variables for operation statistics. Dim numTicks As Long = 0 Dim numRollovers As Long = 0 Dim maxTicks As Long = 0 Dim minTicks As Long = Int64.MaxValue Dim indexFastest As Integer = - 1 Dim indexSlowest As Integer = - 1 Dim milliSec As Long = 0 Dim time10kOperations As Stopwatch = Stopwatch.StartNew() ' Run the current operation 10001 times. ' The first execution time will be tossed ' out, since it can skew the average time. Dim i As Integer For i = 0 To numIterations Dim ticksThisTime As Long = 0 Dim inputNum As Integer Dim timePerParse As Stopwatch Select Case operation Case 0 ' Parse a valid integer using ' a try-catch statement. ' Start a new stopwatch timer. timePerParse = Stopwatch.StartNew() Try inputNum = Int32.Parse("0") Catch e As FormatException inputNum = 0 End Try ' Stop the timer, and save the ' elapsed ticks for the operation. timePerParse.Stop() ticksThisTime = timePerParse.ElapsedTicks Case 1 ' Parse a valid integer using ' the TryParse statement. ' Start a new stopwatch timer. timePerParse = Stopwatch.StartNew() If Not Int32.TryParse("0", inputNum) Then inputNum = 0 End If ' Stop the timer, and save the ' elapsed ticks for the operation. timePerParse.Stop() ticksThisTime = timePerParse.ElapsedTicks Case 2 ' Parse an invalid value using ' a try-catch statement. ' Start a new stopwatch timer. timePerParse = Stopwatch.StartNew() Try inputNum = Int32.Parse("a") Catch e As FormatException inputNum = 0 End Try ' Stop the timer, and save the ' elapsed ticks for the operation. timePerParse.Stop() ticksThisTime = timePerParse.ElapsedTicks Case 3 ' Parse an invalid value using ' the TryParse statement. ' Start a new stopwatch timer. timePerParse = Stopwatch.StartNew() If Not Int32.TryParse("a", inputNum) Then inputNum = 0 End If ' Stop the timer, and save the ' elapsed ticks for the operation. timePerParse.Stop() ticksThisTime = timePerParse.ElapsedTicks Case Else End Select ' Skip over the time for the first operation, ' just in case it caused a one-time ' performance hit. If i = 0 Then time10kOperations.Reset() time10kOperations.Start() Else ' Update operation statistics ' for iterations 1-10001. If maxTicks < ticksThisTime Then indexSlowest = i maxTicks = ticksThisTime End If If minTicks > ticksThisTime Then indexFastest = i minTicks = ticksThisTime End If numTicks += ticksThisTime If numTicks < ticksThisTime Then ' Keep track of rollovers. numRollovers += 1 End If End If Next i ' Display the statistics for 10000 iterations. time10kOperations.Stop() milliSec = time10kOperations.ElapsedMilliseconds Console.WriteLine() Console.WriteLine("{0} Summary:", operationNames(operation)) Console.WriteLine(" Slowest time: #{0}/{1} = {2} ticks", _ indexSlowest, numIterations, maxTicks) Console.WriteLine(" Fastest time: #{0}/{1} = {2} ticks", _ indexFastest, numIterations, minTicks) Console.WriteLine(" Average time: {0} ticks = {1} nanoseconds", _ numTicks / numIterations, numTicks * nanosecPerTick / numIterations) Console.WriteLine(" Total time looping through {0} operations: {1} milliseconds", _ numIterations, milliSec) Next operation End Sub End Class
Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360, Zune
The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Note: