it-swarm-es.tech

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 el más exacto y lo más breve posible.

453
Mahdi Tahsildari

Stopwatch está diseñado para este propósito y es una de las mejores maneras 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 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 una descripción general de Niza.

919
Darin Dimitrov

Desde la 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; "bien, ¿por qué tardó 132 ms la primera vez y mucho menos en 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 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 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 StackOverflow 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 con cronómetro que tal vez desee consultar - Creación de perfiles de rendimiento en .NET

62
series0ne

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

24
Soner Gönül

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

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

17
Jeff Foster

Cronómetro usará 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, entonces sus cifras probablemente se verán afectadas por eventos externos, y me preocuparía mucho. exactitud (como has indicado anteriormente). En su lugar, tomaría una serie de mediciones y consideraría la media y la distribución de esas cifras.

7
Brian Agnew
 using System.Diagnostics;
 class Program
 {
    static void Test1()
    {
        for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine("Test1 " + i);
        }
    }
  static void Main(string[] args)
    {

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test1();
        sw.Stop();
        Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
   }
 }
0

He utilizado la propiedad Environment.TickCount para este propósito.

int start = Environment.TickCount;
// Your code here...
int end = Environment.TickCount;
int diffInMilliseconds = end - start;
0
Srihari Sridharan