c# - startnew - .NET Stopwatch-penalización de rendimiento
stopwatch startnew (5)
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()
debería 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 GetTickCount()
API de Windows 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
tiene la misma precisión (baja) que GetTickCount
.
En teoría, podría haber algún efecto sobre el jitter, pero eso es poco probable.
Posibles duplicados:
¿DateTime.Now es la mejor manera de medir el rendimiento de una función?
Cronómetro versus uso de System.DateTime.Now para cronometrar eventos
Tengo un código que necesita correr lo más rápido 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;
Creo que el segundo será más eficiente en lo que respecta al rendimiento, y como indican los enlaces del comentario, si quieres medir el tiempo por debajo de los segundos, DateTime no será preciso aunque sería eficiente.
Creo que sí porque StopWatch mediría los tics continuamente en comparación con DateTime, que solo contendrá una instancia de DateTime, es decir, startTime.
El Stopwatch
no hace nada entre las llamadas de Start
y Stop
... Simplemente almacena la marca de tiempo actual (a través de QueryPerformanceCounter
) cuando la inicia y la compara con la marca de tiempo actual cuando la detiene. 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
. ...
La respuesta realmente depende de qué precisión 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. Consulte Stopwatch
Desde el punto de vista del rendimiento, dudo que haya tanta diferencia al ver cómo Start () y DateTime.Now almacenan los valores del sistema de medición correspondiente y, al recuperar los milisegundos, calcula la diferencia y la convierte (según se requiera) a la unidad de medida correspondiente
No creo que realmente importe si solo lo llama algunas veces. Sin embargo, todo depende de cuál sea 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.