Calcular el tiempo de ejecución de un método


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 la más exacta, y la más breve posible.

Author: Community, 2012-12-24

5 answers

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 la ejecución del tiempo en. NET.


ACTUALIZACIÓN:

Como 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, tendrá que usar los contadores de rendimiento que están integrados en el sistema operativo. La siguiente respuesta contiene una buena descripción.

 777
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-09 12:27:28

Por experiencia personal, la clase System.Diagnostics.Stopwatch se puede usar para medir el tiempo de ejecución de un método, sin embargo, TENGA 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é tomó 132ms la primera vez, y significativamente menos el resto del tiempo?"

La respuesta es que Stopwatch no compensa la actividad de "ruido de fondo" en. NET, como JITing. Por lo tanto, la primera vez que ejecuta su método,. NET JIT es primero. El tiempo que se tarda en hacer esto se añade al tiempo de ejecución. Del mismo modo, otros factores también harán que el tiempo de ejecución varíe.

Lo que realmente debería estar buscando precisión absoluta es Perfiles de rendimiento!

Echa un vistazo a lo siguiente:

RedGate ANTS Performance Profiler es un producto comercial, pero produce resultados muy precisos. - Aumentar el rendimiento de sus aplicaciones con perfiles. NET

Aquí hay un artículo de StackOverflow sobre perfiles: - ¿Cuáles Son Algunos Buenos Perfiladores. NET?

También he escrito un artículo sobre Perfiles de rendimiento utilizando Cronómetro que puede que desee ver - Perfiles de rendimiento en. NET

 55
Author: series0ne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-06 00:12:46

StopWatch class busca su 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 rendimiento de alta resolución contador.

 22
Author: Soner Gönül,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-24 09:43:34

Si está interesado en entender el rendimiento, la mejor respuesta es usar un generador de perfiles.

De lo contrario, Sistema.Diagnostico.Cronómetro proporciona un temporizador de alta resolución.

 17
Author: Jeff Foster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-24 09:32:49

Cronómetro utilizará el contador de alta resolución

El cronómetro mide el tiempo transcurrido contando las garrapatas del temporizador en el mecanismo de temporizador subyacente. Si el hardware instalado y el funcionamiento el sistema apoya un contador de alta resolución del funcionamiento, entonces el 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. Utilizar la frecuencia y los campos IsHighResolution para determinar el Precision y resolución de la implementación del cronómetro.

Si estás midiendo IO, es probable que tus cifras se vean afectadas por eventos externos, y me preocuparía mucho re. exactitud (como usted ha indicado anteriormente). En su lugar, tomaría un rango de medidas y consideraría la media y la distribución de esas cifras.

 7
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-24 09:33:44