it-swarm.com.de

Messung der Code-Ausführungszeit

Ich möchte wissen, wie viel Zeit ein Vorgang/eine Funktion/ein Auftrag zum Testen benötigt.

Dies ist, was ich getan habe, aber meine Methode ist falsch, weil, wenn die Differenz von Sekunden 0 ist, die verstrichenen Millisekunden nicht zurückgegeben werden können:

Beachten Sie, dass der Wert für den Ruhezustand 500 ms beträgt und die verstrichenen Sekunden 0 sind. Dann können keine Millisekunden zurückgegeben werden.

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

Kann mir jemand einen besseren Weg zeigen, dies zu tun? Vielleicht mit einem TimeSpan?

Die Lösung:

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

Ein besserer Weg wäre, Stoppuhr anstelle von DateTime Unterschieden zu verwenden.

Stoppuhr-Klasse - Microsoft Docs

Stellt eine Reihe von Methoden und Eigenschaften bereit, mit denen Sie die verstrichene Zeit genau messen können.

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);
205
Habib

Stopwatch misst die verstrichene Zeit.

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

Hier ist ein DEMO .

55
Soner Gönül

Sie können diesen Stoppuhr-Wrapper verwenden:

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

Verwendung:

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

Ausgabe:

Insert 10 records: 00:00:00.0617594

Für erweiterte Szenarien können Sie Benchmark.It oder NBench verwenden

38
Alex Erygin

Wenn Sie die Stoppuhr-Klasse verwenden, können Sie die . StartNew () -Methode verwenden, um die Uhr auf 0 zurückzusetzen. Sie müssen also nicht . Reset () aufrufen von . Start (). Könnte sich als nützlich erweisen.

12

Stoppuhr wurde für diesen Zweck entwickelt und ist eine der besten Methoden, um die Zeitausführung in .NET zu messen.

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

Verwenden Sie DateTimes nicht, um die Zeitausführung in .NET zu messen.

2
Sam

Wenn Sie nach der Zeit suchen, die der zugeordnete Thread für die Ausführung von Code in der Anwendung aufgewendet hat.
Sie können die Eigenschaft ProcessThread.UserProcessorTime Verwenden, die Sie unter dem Namespace System.Diagnostics Erhalten.

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

Hinweis: Wenn Sie mehrere Threads verwenden, können Sie die Zeit jedes Threads einzeln berechnen und zur Berechnung der Gesamtdauer zusammenfassen.

1