Stopwatch Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Proporciona un conjunto de métodos y propiedades que puede usar para medir el tiempo transcurrido con precisión.
public ref class Stopwatch
public class Stopwatch
type Stopwatch = class
Public Class Stopwatch
- Herencia
-
Stopwatch
Ejemplos
En el ejemplo siguiente se muestra cómo usar la Stopwatch clase para determinar el tiempo de ejecución de una aplicación.
using System;
using System.Diagnostics;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
}
}
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
End Class
En el ejemplo siguiente se muestra el uso de la Stopwatch clase para calcular los datos de rendimiento.
#using <System.dll>
using namespace System;
using namespace System::Diagnostics;
void DisplayTimerProperties()
{
// Display the timer frequency and resolution.
if ( Stopwatch::IsHighResolution )
{
Console::WriteLine( "Operations timed using the system's high-resolution performance counter." );
}
else
{
Console::WriteLine( "Operations timed using the DateTime class." );
}
Int64 frequency = Stopwatch::Frequency;
Console::WriteLine( " Timer frequency in ticks per second = {0}", frequency );
Int64 nanosecPerTick = (1000L * 1000L * 1000L) / frequency;
Console::WriteLine( " Timer is accurate within {0} nanoseconds", nanosecPerTick );
}
void TimeOperations()
{
Int64 nanosecPerTick = (1000L * 1000L * 1000L) / Stopwatch::Frequency;
const long numIterations = 10000;
// Define the operation title names.
array<String^>^operationNames = {"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.
for ( int operation = 0; operation <= 3; operation++ )
{
// Define variables for operation statistics.
Int64 numTicks = 0;
Int64 numRollovers = 0;
Int64 maxTicks = 0;
Int64 minTicks = Int64::MaxValue;
int indexFastest = -1;
int indexSlowest = -1;
Int64 milliSec = 0;
Stopwatch ^ time10kOperations = Stopwatch::StartNew();
// Run the current operation 10001 times.
// The first execution time will be tossed
// out, since it can skew the average time.
for ( int i = 0; i <= numIterations; i++ )
{
Int64 ticksThisTime = 0;
int inputNum;
Stopwatch ^ timePerParse;
switch ( 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 ( FormatException^ )
{
inputNum = 0;
}
// Stop the timer, and save the
// elapsed ticks for the operation.
timePerParse->Stop();
ticksThisTime = timePerParse->ElapsedTicks;
break;
case 1:
// Parse a valid integer using
// the TryParse statement.
// Start a new stopwatch timer.
timePerParse = Stopwatch::StartNew();
if ( !Int32::TryParse( "0", inputNum ) )
{
inputNum = 0;
}
// Stop the timer, and save the
// elapsed ticks for the operation.
timePerParse->Stop();
ticksThisTime = timePerParse->ElapsedTicks;
break;
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 ( FormatException^ )
{
inputNum = 0;
}
// Stop the timer, and save the
// elapsed ticks for the operation.
timePerParse->Stop();
ticksThisTime = timePerParse->ElapsedTicks;
break;
case 3:
// Parse an invalid value using
// the TryParse statement.
// Start a new stopwatch timer.
timePerParse = Stopwatch::StartNew();
if ( !Int32::TryParse( "a", inputNum ) )
{
inputNum = 0;
}
// Stop the timer, and save the
// elapsed ticks for the operation.
timePerParse->Stop();
ticksThisTime = timePerParse->ElapsedTicks;
break;
default:
break;
}
// Skip over the time for the first operation,
// just in case it caused a one-time
// performance hit.
if ( i == 0 )
{
time10kOperations->Reset();
time10kOperations->Start();
}
else
{
// Update operation statistics
// for iterations 1-10001.
if ( maxTicks < ticksThisTime )
{
indexSlowest = i;
maxTicks = ticksThisTime;
}
if ( minTicks > ticksThisTime )
{
indexFastest = i;
minTicks = ticksThisTime;
}
numTicks += ticksThisTime;
if ( numTicks < ticksThisTime )
{
// Keep track of rollovers.
numRollovers++;
}
}
}
// 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 );
}
}
int main()
{
DisplayTimerProperties();
Console::WriteLine();
Console::WriteLine( "Press the Enter key to begin:" );
Console::ReadLine();
Console::WriteLine();
TimeOperations();
}
using System;
using System.Diagnostics;
namespace StopWatchSample
{
class OperationsTimer
{
public static void Main()
{
DisplayTimerProperties();
Console.WriteLine();
Console.WriteLine("Press the Enter key to begin:");
Console.ReadLine();
Console.WriteLine();
TimeOperations();
}
public static void DisplayTimerProperties()
{
// Display the timer frequency and resolution.
if (Stopwatch.IsHighResolution)
{
Console.WriteLine("Operations timed using the system's high-resolution performance counter.");
}
else
{
Console.WriteLine("Operations timed using the DateTime class.");
}
long frequency = Stopwatch.Frequency;
Console.WriteLine(" Timer frequency in ticks per second = {0}",
frequency);
long nanosecPerTick = (1000L*1000L*1000L) / frequency;
Console.WriteLine(" Timer is accurate within {0} nanoseconds",
nanosecPerTick);
}
private static void TimeOperations()
{
long nanosecPerTick = (1000L*1000L*1000L) / Stopwatch.Frequency;
const long numIterations = 10000;
// Define the operation title names.
String [] operationNames = {"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.
for (int operation = 0; operation <= 3; operation++)
{
// Define variables for operation statistics.
long numTicks = 0;
long numRollovers = 0;
long maxTicks = 0;
long minTicks = Int64.MaxValue;
int indexFastest = -1;
int indexSlowest = -1;
long milliSec = 0;
Stopwatch time10kOperations = Stopwatch.StartNew();
// Run the current operation 10001 times.
// The first execution time will be tossed
// out, since it can skew the average time.
for (int i=0; i<=numIterations; i++)
{
long ticksThisTime = 0;
int inputNum;
Stopwatch timePerParse;
switch (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 (FormatException)
{
inputNum = 0;
}
// Stop the timer, and save the
// elapsed ticks for the operation.
timePerParse.Stop();
ticksThisTime = timePerParse.ElapsedTicks;
break;
case 1:
// Parse a valid integer using
// the TryParse statement.
// Start a new stopwatch timer.
timePerParse = Stopwatch.StartNew();
if (!Int32.TryParse("0", out inputNum))
{
inputNum = 0;
}
// Stop the timer, and save the
// elapsed ticks for the operation.
timePerParse.Stop();
ticksThisTime = timePerParse.ElapsedTicks;
break;
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 (FormatException)
{
inputNum = 0;
}
// Stop the timer, and save the
// elapsed ticks for the operation.
timePerParse.Stop();
ticksThisTime = timePerParse.ElapsedTicks;
break;
case 3:
// Parse an invalid value using
// the TryParse statement.
// Start a new stopwatch timer.
timePerParse = Stopwatch.StartNew();
if (!Int32.TryParse("a", out inputNum))
{
inputNum = 0;
}
// Stop the timer, and save the
// elapsed ticks for the operation.
timePerParse.Stop();
ticksThisTime = timePerParse.ElapsedTicks;
break;
default:
break;
}
// Skip over the time for the first operation,
// just in case it caused a one-time
// performance hit.
if (i == 0)
{
time10kOperations.Reset();
time10kOperations.Start();
}
else
{
// Update operation statistics
// for iterations 1-10000.
if (maxTicks < ticksThisTime)
{
indexSlowest = i;
maxTicks = ticksThisTime;
}
if (minTicks > ticksThisTime)
{
indexFastest = i;
minTicks = ticksThisTime;
}
numTicks += ticksThisTime;
if (numTicks < ticksThisTime)
{
// Keep track of rollovers.
numRollovers ++;
}
}
}
// 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);
}
}
}
}
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
Comentarios
Una Stopwatch instancia puede medir el tiempo transcurrido durante un intervalo o el total del tiempo transcurrido en varios intervalos. En un escenario típico Stopwatch , se llama al Start método y, a continuación, se llama Stop al método y, a continuación, se comprueba el tiempo transcurrido mediante la Elapsed propiedad .
Una Stopwatch instancia se está ejecutando o detenida; use IsRunning para determinar el estado actual de .Stopwatch Use Start para comenzar a medir el tiempo transcurrido; use Stop para detener la medición del tiempo transcurrido. Consulte el valor de tiempo transcurrido a través de las propiedades Elapsed, ElapsedMillisecondso ElapsedTicks. Puede consultar las propiedades de tiempo transcurrido mientras la instancia se está ejecutando o detenida. Las propiedades de tiempo transcurrido aumentan constantemente mientras Stopwatch se ejecuta; permanecen constantes cuando se detiene la instancia.
De forma predeterminada, el valor de tiempo transcurrido de una Stopwatch instancia es igual al total de todos los intervalos de tiempo medidos. Cada llamada a comienza a Start contar en el tiempo acumulado transcurrido; cada llamada para Stop finalizar la medición del intervalo actual e inmoviliza el valor de tiempo acumulado transcurrido. Use el Reset método para borrar el tiempo transcurrido acumulado en una instancia existente Stopwatch .
Las Stopwatch medidas han transcurrido el tiempo contando los tics del temporizador en el mecanismo del temporizador subyacente. Si el hardware instalado y el sistema operativo admiten un contador de rendimiento de alta resolución, la Stopwatch clase usa ese contador para medir el tiempo transcurrido. De lo contrario, la Stopwatch clase usa el temporizador del sistema para medir el tiempo transcurrido. Use los Frequency campos y IsHighResolution para determinar la precisión y resolución de la Stopwatch implementación de tiempo.
La Stopwatch clase ayuda a la manipulación de contadores de rendimiento relacionados con el tiempo dentro del código administrado. En concreto, el campo y el Frequency método se pueden usar en lugar de las API QueryPerformanceFrequency
de Windows no administradas y QueryPerformanceCounter
.GetTimestamp
Nota
En un equipo con varios procesadores, no importa en qué procesador se ejecuta el subproceso. Sin embargo, debido a errores en el BIOS o la capa de abstracción de hardware (HAL), puede obtener resultados de tiempo diferentes en diferentes procesadores. Para especificar la afinidad de procesador para un subproceso, use el ProcessThread.ProcessorAffinity método .
Constructores
Stopwatch() |
Inicializa una nueva instancia de la clase Stopwatch. |
Campos
Frequency |
Obtiene la frecuencia del temporizador en forma de número de tics por segundo. Este campo es de solo lectura. |
IsHighResolution |
Indica si el temporizador se basa en un contador de rendimiento de alta resolución. Este campo es de solo lectura. |
Propiedades
Elapsed |
Obtiene el tiempo total transcurrido medido por la instancia actual. |
ElapsedMilliseconds |
Obtiene el tiempo total transcurrido medido por la instancia actual, en milisegundos. |
ElapsedTicks |
Obtiene el tiempo total transcurrido medido por la instancia actual, en tics de temporizador. |
IsRunning |
Obtiene un valor que indica si el temporizador Stopwatch está en funcionamiento. |
Métodos
Equals(Object) |
Determina si el objeto especificado es igual que el objeto actual. (Heredado de Object) |
GetElapsedTime(Int64) |
Obtiene el tiempo transcurrido desde el |
GetElapsedTime(Int64, Int64) |
Obtiene el tiempo transcurrido entre dos marcas de tiempo recuperadas mediante GetTimestamp(). |
GetHashCode() |
Sirve como la función hash predeterminada. (Heredado de Object) |
GetTimestamp() |
Obtiene el número actual de tics del mecanismo de temporización. |
GetType() |
Obtiene el Type de la instancia actual. (Heredado de Object) |
MemberwiseClone() |
Crea una copia superficial del Object actual. (Heredado de Object) |
Reset() |
Detiene la medición del intervalo de tiempo y restablece el tiempo transcurrido en cero. |
Restart() |
Detiene la medición del intervalo de tiempo, restablece el tiempo transcurrido en cero y comienza a medir el tiempo transcurrido. |
Start() |
Inicia o reanuda la medición del tiempo transcurrido para un intervalo. |
StartNew() |
Inicializa una nueva instancia de Stopwatch, establece la propiedad de tiempo transcurrido en cero e inicia la medición de tiempo transcurrido. |
Stop() |
Detiene la medición del tiempo transcurrido para un intervalo. |
ToString() |
Devuelve la Elapsed hora como una cadena. |
ToString() |
Devuelve una cadena que representa el objeto actual. (Heredado de Object) |