442 votos

Es DateTime.Now la mejor manera de medir en función del rendimiento?

Necesito encontrar un cuello de botella y la necesidad de precisión como sea posible medir el tiempo.

Es el siguiente fragmento de código la mejor manera de medir el rendimiento?

DateTime startTime = DateTime.Now;

// Some execution process

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);

612voto

Markus Olsson Puntos 12651

No, no lo es. Utilizar el Cronómetro (en System.Diagnostics)

Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

Cronómetro comprueba automáticamente la existencia de alta precisión de temporizadores.

Vale la pena mencionar que DateTime.Now a menudo es un poco más lento que DateTime.UtcNow debido a la labor que se ha hecho con husos horarios, horario de verano y tal.

DateTime.UtcNow normalmente tiene una resolución de 15 ms. Ver John Chapman blog sobre DateTime.Now de precisión para un gran resumen.

Curiosidades: El cronómetro cae de nuevo en DateTime.UtcNow si su hardware no soporta una alta frecuencia de contador. Usted puede comprobar para ver si el Cronómetro utiliza el hardware para lograr una alta precisión mirando el campo estático Stopwatch.IsHighResolution.

88voto

Simucal Puntos 34961

Si quieres algo rápido y sucio yo sugeriría usar el Cronómetro en lugar de un grado de precisión mayor.

Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();

Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);

Alternativamente, si usted necesita algo un poco más sofisticado, probablemente, usted debe considerar el uso de una 3 ª parte del analizador tales como las HORMIGAS.

52voto

Valentin Kuzub Puntos 4349

Este artículo dice que en primer lugar usted necesita para comparar las tres alternativas, Stopwatch, DateTime.Now Y DateTime.UtcNow.

También muestra que en algunos casos (cuando el contador de rendimiento no existe) Cronómetro está utilizando DateTime.UtcNow + procesamiento adicional. Debido a que es evidente que, en ese caso DateTime.UtcNow es la mejor opción (porque otro use + algunos de procesamiento)

Sin embargo, como resulta que el contador casi siempre existe - ver Explicación acerca de alta resolución del contador de rendimiento y de su existencia relativa a la .NET Cronómetro?.

Aquí está un gráfico de rendimiento. Aviso cómo el bajo costo de rendimiento UtcNow tiene en comparación con otras alternativas:

Enter image description here

El eje X se muestra el tamaño de los datos, y el eje y es el tiempo relativo del ejemplo.

Una cosa Stopwatch es mejor, es que la que proporciona un mayor tiempo de resolución de las mediciones. Otro es el más ORIENTADO a la naturaleza. Sin embargo, la creación de un OO contenedor alrededor UtcNow no puede ser difícil.

18voto

Anthony Mastrean Puntos 8582

Es útil para impulsar su evaluación comparativa de código en una clase de utilidad de este método. La StopWatch de la clase no necesita ser Disposed o Stopped de error. Así, el código más sencillo a la hora de algunas acción es

public partial class With
{
    public static long Benchmark(Action action)
    {
        var stopwatch = Stopwatch.StartNew();
        action();
        stopwatch.Stop();
        return stopwatch.ElapsedMilliseconds;
    }
}

Ejemplo de código de llamada

public void Execute(Action action)
{
    var time = With.Benchmark(action);
    log.DebugFormat("Did action in {0} ms.", time);
}

Aquí está el método de extensión de la versión

public static class Extensions
{
    public static long Benchmark(this Action action)
    {
        return With.Benchmark(action);
    }
}

Y muestra el código de llamada

public void Execute(Action action)
{
    var time = action.Benchmark()
    log.DebugFormat("Did action in {0} ms.", time);
}

16voto

jsight Puntos 16025

El cronómetro funcionalidad sería mejor (mayor precisión). También me gustaría recomendar acabo de descargar uno de los populares perfiladores, aunque (DotTrace y las HORMIGAS son los que he usado la mayoría de los... de la versión de prueba gratuita para DotTrace es totalmente funcional y no nag como algunos de los otros).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: