La velocidad de ejecución del software debe estar dentro de un rango aceptable para el usuario. A menudo, mejorar la velocidad de esas rutinas de corta duración pero de uso frecuente aumentará en gran medida la velocidad general del software.
Para mejorar la velocidad, por supuesto, primero es necesario poder medir el tiempo. Bien, entonces consideremos la situación en la pista. Tan pronto como suene el arma, presione el cronómetro para comenzar a cronometrar y finalice el cronometraje cuando el jugador llegue a la línea de meta. En este momento, podrá saber el tiempo utilizado por el jugador. . Antes de comenzar la siguiente ronda, el cronómetro debe ponerse a cero. .NET2.0 también proporciona un cronómetro de este tipo: la clase Cronómetro, que puede medir el tiempo con mayor precisión.
Prueba de velocidad:
El rendimiento y la capacidad de prueba del software es un tema complejo. Garantizar que una aplicación cumpla con las expectativas del usuario requiere considerar su rendimiento y capacidad de prueba durante el ciclo de desarrollo. Esto es crucial durante la fase de diseño; es casi seguro que un diseño deficiente conducirá a una mala experiencia de usuario. Sin embargo, un buen diseño por sí solo no garantiza que el programa se ejecutará de manera eficiente. La calidad del código final es igualmente importante.
Medir una rutina de larga duración es bastante sencillo. Si un proceso dura varios minutos, se puede utilizar un reloj para registrar el tiempo. Por ejemplo, para un proceso que tarda dos minutos en ejecutarse, una mejora del 10% puede ahorrar 12 segundos, lo cual es fácil de determinar.
Y si desea medir un proceso a muy corto plazo, debe considerar una mayor precisión. Por ejemplo, hay algunas rutinas muy pequeñas que pueden tardar solo una milésima de segundo en ejecutarse, pero se llamarán 1 millón de veces. El efecto acumulativo es obvio. En versiones anteriores de .NET framework, era necesario utilizar las funciones API de Windows, y en .NET framework 2.0, Microsoft introdujo la clase Stopwatch (es nuestro cronómetro) para simplificar las tareas de medición del tiempo.
Clase de cronómetro:
Usar la clase Cronómetro para medir el tiempo es muy sencillo. Al igual que los cronómetros en la vida real, los objetos de esta clase también pueden iniciar, detener y volver a cero (restablecer) el contador, pero es mucho más preciso que los cronómetros comunes: puede tener una precisión de microsegundos (es decir, millones de segundos). . fracción de segundo).
Código de muestra:
Para demostrar el uso de Stopwatch, usemos un fragmento de código. Aquí hay una aplicación de consola que acumula todos los números enteros entre 1 y 1 millón:
usando el
espacio de nombres StopWatchClass
;
{
programa de clase
{
vacío estático principal (cadena [] argumentos)
{
total largo = 0;
para (int i = 1; i <= 10000000; i++)
{
total += yo;
}
}
}
}
Agregar objeto Cronómetro:
La clase Stopwatch se encuentra en el espacio de nombres System.Diagnostics. Aquí está el código después de agregar el objeto:
usando Sistema;
usando
el espacio de nombres System.Diagnostics StopWatchClass
;
{
programa de clase
{
vacío estático principal (cadena [] argumentos)
{
Cronómetro = nuevo Cronómetro();
total largo = 0;
para (int i = 1; i <= 10000000; i++)
{
total += yo;
}
}
}
}
Controlar el objeto Cronómetro:
Stopwatch proporciona varios métodos para controlar el objeto Stopwatch. El método Start inicia una operación de cronometraje y el método Stop detiene el cronometraje. En este momento, si se utiliza el método Inicio por segunda vez, el cronometraje continuará y el resultado final del cronometraje es la acumulación de los dos cronometrajes. Para evitar esta situación, utilice el método Reset para restablecer el objeto a cero antes del segundo temporizador. Ninguno de estos tres métodos requiere parámetros. El código es:
usando Sistema;
usando
el espacio de nombres System.Diagnostics StopWatchClass
;
{
programa de clase
{
vacío estático principal (cadena [] argumentos)
{
Cronómetro = nuevo Cronómetro();
total largo = 0;
temporizador.Inicio();
para (int i = 1; i <= 10000000; i++)
{
total += yo;
}
temporizador.Stop();
}
}
}
Leer los resultados del cronómetro:
<!--[if !supportLists]--><!--[endif]--> Después de finalizar el cronometraje, el siguiente paso es leer los resultados del cronometraje. La clase Stopwatch proporciona las siguientes propiedades:
<!--[if !supportLists]--><!--[endif]--><!--[if !supportLists]--><!--[endif]-->
Transcurrido: devuelve un objeto TimeSpan, que representa el intervalo de tiempo;
ElapsedMillisegundos: devuelve el número de microsegundos transcurridos por el tiempo. La precisión es ligeramente menor, adecuada para tiempos un poco más largos;
ElapsedTicks: devuelve el número de tics del temporizador transcurridos. Un tic del cronómetro es la unidad de medida más pequeña posible para un objeto Cronómetro. La duración del tic del temporizador está determinada por la computadora y el sistema operativo específicos. El valor del campo estático Frecuencia del objeto Cronómetro representa el número de tics del temporizador contenidos en un segundo. Tenga en cuenta la diferencia en las unidades de tiempo utilizadas por la propiedad Ticks de TimeSpan.
Se debe seleccionar una de estas propiedades en función de la tarea de sincronización. En nuestro programa de ejemplo, la propiedad Transcurrido proporciona la precisión requerida para generar el número de microsegundos transcurridos. Esta es también la mayor precisión de TimeSpan.
Aquí está el código final del programa:
usando Sistema;
usando
el espacio de nombres System.Diagnostics StopWatchClass
;
{
programa de clase
{
vacío estático principal (cadena [] argumentos)
{
Cronómetro = nuevo Cronómetro();
total largo = 0;
temporizador.Inicio();
para (int i = 1; i <= 10000000; i++)
{
total += yo;
}
temporizador.Parada();
micro decimal = temporizador.Elapsed.Ticks / 10m;
Console.WriteLine("El tiempo de ejecución fue {0:F1} microsegundos.", micro);
}
}
}
Además, use la propiedad IsRunning para verificar si una instancia de Stopwatch está cronometrándose y use el método StartNew para iniciar un nuevo temporizador.