Calcula 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 forma de calcular el tiempo de ejecución? Thread ? Timer ? Stopwatch ? ¿Alguna otra solución? Quiero el más exacto, y el más breve posible.

Stopwatch está diseñado para este propósito y es una de las mejores formas de medir la ejecución del tiempo 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.


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 una buena descripción general.

Desde la experiencia personal, la clase System.Diagnostics.Stopwatch se puede utilizar 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 = Stopwatch.StartNew(); for(int index = 0; index < 10; index++) { 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 rest 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 agrega al momento de la ejecución. Igualmente, otros factores también causarán que el tiempo de ejecución varíe.

¡Lo que realmente debería buscar una precisión absoluta es el perfil de rendimiento !

Eche un vistazo a lo siguiente:

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

Aquí hay un artículo de StackOverflow sobre el perfil: - ¿Cuáles son algunos buenos perfiladores de .NET?

También escribí un artículo sobre Perfilado del Desempeño usando Cronómetro que es posible que desee ver: Perfilado de Desempeño en .NET

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

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

De lo contrario, System.Diagnostics.StopWatch proporciona un temporizador de alta resolución.

StopWatch utilizará el contador de alta resolución

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.

Si estás midiendo IO, tus cifras probablemente se verán afectadas por eventos externos, y me preocuparía tanto. exactitud (como ha indicado anteriormente). En cambio, tomaría una variedad de mediciones y consideraría la media y la distribución de esas figuras.