c# - Cronómetro versus uso de System.DateTime.Now para cronometrar eventos
performance timing (3)
Es mejor usar la clase Cronómetro porque es mucho más preciso que restar valores de Fecha y hora:
Stopwatch s = Stopwatch.StartNew();
// Tested code here
s.Stop();
Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds);
Desafortunadamente, esta simple pieza de código no será suficiente para obtener mediciones precisas la mayoría de las veces porque hay mucha actividad bajo el sistema operativo, que puede robar algo de tiempo de CPU y ralentizar la ejecución de su código. Es por eso que es mejor ejecutar las pruebas varias veces y luego eliminar las más bajas y las más altas. Para esa puprose, es una buena solución tener un método que ejecute el código probado varias veces, elimine los tiempos más bajos y los mejores, y calcule el tiempo promedio. He publicado un método de prueba de muestra en mi blog .
Esta pregunta ya tiene una respuesta aquí:
Quería hacer un seguimiento del rendimiento de mi código, así que almacené la hora de inicio y finalización usando System.DateTime.Now
. Tomé la diferencia entre los dos como el tiempo de mi código para ejecutar.
Sin embargo, noté que la diferencia no parecía ser precisa. Así que traté de usar un objeto Stopwatch
. Esto resultó ser mucho, mucho más preciso.
¿Alguien puede decirme por qué el Stopwatch
sería más preciso que calcular la diferencia entre una hora de inicio y una de fin usando System.DateTime.Now
?
Por cierto, no estoy hablando de un décimo de un por ciento. Obtengo una diferencia de 15-20%.
Según MSDN :
El cronómetro mide el tiempo transcurrido contando las marcas del temporizador en el mecanismo del temporizador subyacente. Si el hardware y el sistema operativo instalados admiten un contador de rendimiento de alta resolución, la clase Cronómetro usa ese contador para medir el tiempo transcurrido. De lo contrario, la clase Cronómetro utiliza el temporizador del sistema para medir el tiempo transcurrido. Utilice los campos Frecuencia e IsHighResolution para determinar la precisión y la resolución de la implementación del tiempo del cronómetro.
Utiliza una resolución / precisión más alta que DateTime.Now
.
También puede consultar estos enlaces relacionados:
Environment.TickCount versus DateTime.Now
¿DateTime.Now es la mejor manera de medir el rendimiento de una función?
DateTime
es lo suficientemente bueno para la precisión del segundo, pero cualquier cosa más allá de eso recomendaría StopWatch
.
este enlace de rendimiento de la función de temporización discute su problema exacto, específicamente este párrafo:
El problema es que, según MSDN, la resolución de la función DateTime.Now es de 10+ milisegundos, ¡y tenemos que llamarla dos veces! Entonces eso introduciría un swing de más de 20 ms en su medición de tiempo de ejecución. Como nuestras llamadas a funciones suelen ser mucho más rápidas de devolver que esta ventana de 20 ms, esto no es suficiente.
EDITAR: Suena como el segundo DateTime.Now se está llamando en un momento diferente que cuando el método del cronómetro concluye.