Quiero saber cuánto tiempo tarda un procedimiento / función / orden en finalizar, con fines de prueba.
Esto es lo que hice, pero mi método es incorrecto porque si la diferencia de segundos es 0, no puedo devolver los milisegundos transcurridos:
Observe que el valor de suspensión es de 500 ms, por lo que los segundos transcurridos son 0 y luego no pueden devolver milisegundos.
Dim Execution_Start As System.DateTime = System.DateTime.Now
Threading.Thread.Sleep(500)
Dim Execution_End As System.DateTime = System.DateTime.Now
MsgBox(String.Format("H:{0} M:{1} S:{2} MS:{3}", _
DateDiff(DateInterval.Hour, Execution_Start, Execution_End), _
DateDiff(DateInterval.Minute, Execution_Start, Execution_End), _
DateDiff(DateInterval.Second, Execution_Start, Execution_End), _
DateDiff(DateInterval.Second, Execution_Start, Execution_End) * 60))
¿Alguien puede mostrarme una mejor manera de hacer esto? ¿Quizás con un TimeSpan
?
La solución:
Dim Execution_Start As New Stopwatch
Execution_Start.Start()
Threading.Thread.Sleep(500)
MessageBox.Show("H:" & Execution_Start.Elapsed.Hours & vbNewLine & _
"M:" & Execution_Start.Elapsed.Minutes & vbNewLine & _
"S:" & Execution_Start.Elapsed.Seconds & vbNewLine & _
"MS:" & Execution_Start.Elapsed.Milliseconds & vbNewLine, _
"Code execution time", MessageBoxButtons.OK, MessageBoxIcon.Information)
DateTime.Now
debido a problemas con el horario de verano y la zona horaria. Lea la publicación de mi blog sobre este mismo temaRespuestas:
Una mejor forma sería utilizar Cronómetro , en lugar de
DateTime
diferencias.Clase de cronómetro - Microsoft Docs
fuente
Thread.Sleep
, solo está allí como un código de muestra para mostrar el retraso ... de hecho, debe evitar usarThread.Sleep
en cualquier parte de su códigoStopwatch
mide el tiempo transcurrido.Aquí hay un
DEMO
.fuente
Stopwatch
en la parte superior de cada línea y deténgalo después de cada línea. Recuerde, debe usar tambiénStopwatch.Reset
después de cada línea para calcular. Basado en su línea; echa un vistazo a ideone.com/DjR6bastopwatch.Elapsed.ToString(@"d\.hh\:mm\:ss")
que me parece una forma más limpia.Puede utilizar este contenedor de cronómetro:
Uso:
Salida:
Para escenarios avanzados, puede usar BenchmarkDotNet o Benchmark.It o NBench
fuente
Si usa la clase Stopwatch, puede usar el método .StartNew () para restablecer el reloj a 0. Por lo tanto, no tiene que llamar a .Reset () seguido de .Start (). Podría ser útil.
fuente
Stopwatch está diseñado para este propósito y es una de las mejores formas de medir la ejecución del tiempo en .NET.
No utilice DateTimes para medir el tiempo de ejecución en .NET.
fuente
Si está buscando la cantidad de tiempo que el hilo asociado ha pasado ejecutando código dentro de la aplicación.
Puede usar
ProcessThread.UserProcessorTime
Propiedad que puede obtener en elSystem.Diagnostics
espacio de nombres.Nota: si está utilizando varios hilos, puede calcular el tiempo de cada hilo individualmente y resumirlo para calcular la duración total.
fuente
No pude ver una versión de vb.net de cómo se podría usar la clase de cronómetro, así que proporcioné un ejemplo a continuación.
Espero que esto ayude a cualquiera que haya llegado a esta pregunta buscando vb.net.
fuente