136 votes

Mesure du temps d'exécution du code

Je veux savoir combien de temps prend une procédure/fonction/ordre pour se terminer, à des fins de test.

C'est ce que j'ai fait mais ma méthode est erronée car si la différence de secondes est de 0, je ne peux pas retourner les millisecondes écoulées :

Remarquez que la valeur de la mise en veille est de 500 ms, les secondes écoulées sont donc égales à 0, ce qui ne permet pas de renvoyer des millisecondes.

    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))

Quelqu'un peut-il me montrer une meilleure façon de procéder ? Peut-être avec un TimeSpan ?

La solution :

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)

272voto

Habib Points 93087

Une meilleure solution serait d'utiliser Chronomètre au lieu de DateTime différences.

Classe chronomètre - Microsoft Docs

Fournit un ensemble de méthodes et de propriétés que vous pouvez utiliser pour mesurer avec précision le temps écoulé.

// create and start a Stopwatch instance
Stopwatch stopwatch = Stopwatch.StartNew(); 

// replace with your sample code:
System.Threading.Thread.Sleep(500);

stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);

69voto

Soner Gönül Points 35739

Stopwatch mesure le temps écoulé.

// 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);

Voici un DEMO .

57voto

Alex Erygin Points 2586

Vous pouvez utiliser ce wrapper de chronomètre :

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}");
    }
}

Utilisation :

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

Sortie :

Insert 10 records: 00:00:00.0617594

Pour les scénarios avancés, vous pouvez utiliser BenchmarkDotNet o Benchmark.It o NBench

15voto

Marcell Points 462

Si vous utilisez la classe Chronomètre, vous pouvez utiliser la fonction .StartNew() pour réinitialiser la montre à 0. Ainsi, vous n'avez pas besoin d'appeler .reset() suivi par .Start(). Ça pourrait être utile.

5voto

Sam Points 91

Le chronomètre est conçu à cet effet et constitue l'un des meilleurs moyens de mesurer le temps d'exécution en .NET.

var watch = System.Diagnostics.Stopwatch.StartNew();
/* the code that you want to measure comes here */
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

N'utilisez pas les DateTimes pour mesurer le temps d'exécution dans .NET.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X