Medir el tiempo de ejecución del código

Quiero saber cuánto tiempo tarda un procedimiento / función / orden en finalizar, para fines de prueba.

Esto es lo que hice pero mi método está equivocado porque si la diferencia de segundos es 0 no puede devolver los milisegundos transcurridos:

Observe que el valor de reposo es de 500 ms, por lo que los segundos transcurridos son 0 y, a continuación, no puede 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)) 

¿Puede alguien mostrarme una mejor manera de hacer esto? Tal vez 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) 

Una mejor manera sería usar Stopwatch , en lugar de las diferencias DateTime .

Clase de cronómetro – MSDN

Proporciona un conjunto de métodos y propiedades que puede usar para medir con precisión el tiempo transcurrido.

 Stopwatch stopwatch = Stopwatch.StartNew(); //creates and start the instance of Stopwatch //your sample code System.Threading.Thread.Sleep(500); stopwatch.Stop(); Console.WriteLine(stopwatch.ElapsedMilliseconds); 

Stopwatch mide el tiempo transcurrido.

 // Create new stopwatch Stopwatch stopwatch = new Stopwatch(); // Begin timing stopwatch.Start(); Threading.Thread.Sleep(500) // Stop timing stopwatch.Stop(); Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed); 

Aquí hay una DEMO .

Puede usar este contenedor de cronómetro:

 public class Benchmark : IDisposable { private readonly Stopwatch timer = new Stopwatch(); private readonly string benchmarkName; public Benchmark(string benchmarkName) { this.benchmarkName = benchmarkName; timer.Start(); } public void Dispose() { timer.Stop(); Console.WriteLine($"{benchmarkName} {timer.Elapsed}"); } } 

Uso:

 using (var bench = new Benchmark($"Insert {n} records:")) { ... your code here } 

Salida:

 Insert 10 records: 00:00:00.0617594 

Para escenarios avanzados, puede usar Benchmark.It o NBench

Si usa la clase Cronómetro, 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.

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 DateTimes para medir la ejecución del tiempo en .NET.

Si está buscando la cantidad de tiempo que el subproceso asociado ha pasado ejecutando código dentro de la aplicación.
Puede usar la propiedad ProcessThread.UserProcessorTime que puede obtener en el espacio de nombres System.Diagnostics .

 TimeSpan startTime= Process.GetCurrentProcess().Threads[i].UserProcessorTime; // i being your thread number, make it 0 for main //Write your function here TimeSpan duration = Process.GetCurrentProcess().Threads[i].UserProcessorTime.Subtract(startTime); Console.WriteLine($"Time caluclated by CurrentProcess method: {duration.TotalSeconds}"); // This syntax works only with C# 6.0 and above 

Nota: Si está utilizando varios hilos, puede calcular el tiempo de cada hilo individualmente y resumirlo para calcular la duración total.