2011-08-08 12 views
31

posibles duplicados:
Is DateTime.Now the best way to measure a function's performance?
Stopwatch vs. using System.DateTime.Now for timing events.NET Cronómetro - penalización de rendimiento

tengo código que tiene que correr tan rápido como sea posible. Para poder registrar el tiempo de ejecución, utilizo la clase Stopwatch. Sospecho, Cronómetro puede afectar el rendimiento de una mala manera. ¿Tal vez usar una diferencia de DateTime puede ser más efectivo?

¿Cuál crees que tiene un mejor rendimiento?

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
int a = 5; 

// Critical lines of code 

long elapsedMs = se.Elapsed.TotalMilliseconds; 

O

DateTime startDate = DateTime.Now; 
int a = 5; 

// Critical lines of code 

long elapsedMs = DateTime.Now.Subtract(startDate).TotalMilleseconds; 
+4

I uso altamente sospechoso ya sea rendirán que los mismos resultados. Diferencias inconsecuentes. –

+1

Ver http://stackoverflow.com/questions/2923283/stopwatch-vs-using-system-datetime-now-for-timing-events – ccellar

+1

Ver: http://stackoverflow.com/questions/28637/is-datetime- now-the-best-way-to-measure-a-functions-performance - tl; dr: usa el cronómetro. –

Respuesta

43

El Stopwatch no está haciendo nada entre las llamadas a Start y Stop ... Simplemente almacena la fecha y hora actual (a través de QueryPerformanceCounter) cuando se inicia, y compararlo con la fecha y hora actual cuando se deja de él. Por lo tanto, no hay ninguna razón por la que pueda afectar el rendimiento de su código, al menos de manera significativa. Stopwatch fue diseñado específicamente para mediciones de tiempo precisas, por lo que puede estar seguro de que está completamente optimizado. También es mucho más preciso que comparar valores sucesivos de DateTime.Now. ...

+1

La cuestión es también de lo que hace el cronómetro hacer dentro de Inicio() y Stop) llamadas (y cómo esto afecta a la aplicación. VS2013 Performance Analyzer muestra que los Stopwatch.Stop (residuos) aproximadamente 0,92% (aplicación hace 80000 consultas SQL, 1thread, sw.Start()/sw.Stop() antes de cada) – mistika

+0

La explicación que estaba buscando. – Neo

1

creo que el segundo será más eficiente en cuanto a rendimiento se refiere, y como los enlaces en el comentario, indicar, si se desea medir el tiempo por debajo de segundos y luego DateTime no será preciso aunque sería eficiente

Creo que porque StopWatch estaría midiendo los tics continuamente en comparación con DateTime, que solo contendrá una instancia de DateTime, es decir, startTime.

+1

¿Cuidar para aclarar? – ChaosPandion

+0

+1 para la primera oración, que es correcta. Obtener el actual DateTime es solo leer un contador de la memoria. Sin embargo, como dices, el rendimiento no es la medida correcta para pensar aquí, su precisión. – nawfal

8

Como su código de generación de perfiles se ejecuta solo una vez, su impacto en el rendimiento debería ser insignificante. Es solo un problema si pones llamadas al cronómetro dentro de tu ciclo interno/rutas de código críticas.

GetTickCount() debe ser una de las formas más rápidas de crear perfiles, pero solo tiene una precisión de unos pocos milisegundos. La función de API de Windows GetTickCount() solo verifica una variable simple (que se actualiza cada pocos milisegundos); su costo es el costo de una invocación de método nativo y nada más. Está expuesto como Environment.TickCount en .NET. Pero como dije, dudo que esto importe. DateTime.UtcNow/Now tienen la misma (baja) precisión que GetTickCount.

En teoría, podría haber algún efecto sobre la fluctuación de fase, pero eso es poco probable.

1

No creo que realmente importe si solo lo está llamando un par de veces, Sin embargo, todo depende de cuál es el nivel de precisión que está solicitando; Stopwatch es mucho más preciso, ya que depende de QueuePerformanceCounter API, por lo que utiliza una resolución más alta.

1

La respuesta realmente depende de la precisión que intentes lograr. Para precisión superior a los segundos, el cronómetro es un mejor enfoque debido al uso de un sistema de medición más preciso que el de fecha y hora.Ver http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Desde el punto de vista del rendimiento, dudo que haya que gran parte de la diferencia de ver cómo el inicio() y DateTime.Now almacenan los valores del sistema de medición correspondiente y al recuperar los milisegundos que calcula la diferencia y convertidos (según sea necesario) a la unidad de medida correspondiente

Cuestiones relacionadas