c# - medir - tiempo de ejecucion de un programa
Calcular el tiempo de ejecución de un método. (5)
Posible duplicado:
¿Cómo mido cuánto tiempo se está ejecutando una función?
Tengo un método de toma de tiempo de E / S que copia datos de una ubicación a otra. ¿Cuál es la mejor y más real manera de calcular el tiempo de ejecución? Thread
Timer
Stopwatch
? ¿Alguna otra solución? Quiero el más exacto y lo más breve posible.
Por experiencia personal, la clase System.Diagnostics.Stopwatch
se puede usar para medir el tiempo de ejecución de un método, sin embargo, CUIDADO : ¡No es del todo exacto!
Considere el siguiente ejemplo:
Stopwatch sw;
for(int index = 0; index < 10; index++)
{
sw = Stopwatch.StartNew();
DoSomething();
Console.WriteLine(sw.ElapsedMilliseconds);
}
sw.Stop();
Resultados de ejemplo
132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms
Ahora te estás preguntando; "Bueno, ¿por qué tardó 132 ms la primera vez y mucho menos en el resto del tiempo?"
La respuesta es que el Stopwatch
no compensa la actividad de "ruido de fondo" en .NET, como JITing. Por lo tanto, la primera vez que ejecute su método, primero use .NET JIT. El tiempo que lleva hacer esto se agrega a la hora de la ejecución. Igualmente, otros factores también harán que el tiempo de ejecución varíe.
¡Lo que realmente debería estar buscando para una precisión absoluta es el Perfil de rendimiento !
Echa un vistazo a lo siguiente:
RedGate ANTS Performance Profiler es un producto comercial, pero produce resultados muy precisos. - Aumente el rendimiento de sus aplicaciones con perfiles .NET
Aquí hay un artículo de sobre la creación de perfiles: - ¿Cuáles son algunos buenos perfiladores .NET?
También he escrito un artículo sobre la generación de perfiles de rendimiento utilizando el cronómetro que es posible que desee consultar - Creación de perfiles de rendimiento en .NET
Si está interesado en comprender el rendimiento, la mejor respuesta es utilizar un generador de perfiles.
De lo contrario, Stopwatch proporciona un temporizador de alta resolución.
Stopwatch clase Stopwatch busca tu mejor solución.
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
También tiene un campo estático llamado Stopwatch.IsHighResolution
. Por supuesto, este es un problema de hardware y sistema operativo.
Indica si el temporizador se basa en un contador de rendimiento de alta resolución.
Stopwatch utilizará el contador de alta resolución
El cronómetro mide el tiempo transcurrido contando los tics del temporizador en el mecanismo del cronómetro 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 usa el temporizador del sistema para medir el tiempo transcurrido. Use los campos Frecuencia e IsHighResolution para determinar la precisión y la resolución de la implementación del cronometraje del cronómetro.
Si está midiendo IO, sus cifras probablemente se verán afectadas por eventos externos, y me preocuparía mucho. exactitud (como usted ha indicado anteriormente). En su lugar, tomaría un rango de mediciones y consideraría la media y la distribución de esas cifras.
Stopwatch
está diseñado para este propósito y es una de las mejores formas de medir el tiempo de ejecución en .NET.
var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
No use DateTime para medir el tiempo de ejecución en .NET.
ACTUALIZAR:
Como lo señaló @ series0ne en la sección de comentarios: si desea una medición real y precisa de la ejecución de algún código, deberá usar los contadores de rendimiento integrados en el sistema operativo. La siguiente respuesta contiene un buen resumen.