Messung der Code-Ausführungszeit

120

Ich möchte wissen, wie viel Zeit eine Prozedur / Funktion / Bestellung zu Testzwecken benötigt, um fertig zu werden.

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

Beachten Sie, dass der Schlafwert 500 ms beträgt, sodass die verstrichenen Sekunden 0 sind und keine Millisekunden zurückgegeben werden können.

    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)
ElektroStudios
quelle
1
Sie können meine Antwort auf diese Frage sehen:> stackoverflow.com/a/16130243/1507182 Viel Glück
Obama
1
@Soner Wenn ich es mit C # markiert habe, liegt das daran, dass C # -Code für mich willkommen ist.
ElektroStudios
2
Mögliches Duplikat der Find Execution Time einer Methode
Jesse
2
Abgesehen von den offensichtlichen Gründen für die Verwendung einer Stoppuhr sollten Sie DateTime.Nowaufgrund von Sommerzeit- und Zeitzonenproblemen niemals rechnen . Bitte lesen Sie meinen Blog-Beitrag zu diesem Thema
Matt Johnson-Pint

Antworten:

233

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

Stoppuhrklasse - Microsoft Docs

Bietet eine Reihe von Methoden und Eigenschaften, 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);
Habib
quelle
1
@ElektroHacker, Sie sind willkommen, es ist einfacher zu bedienen, und es ist genauer als DateTime :)
Habib
1
Weitere Informationen finden Sie unter github.com/chai-deshpande/LogExec (ein NUGET-Paket ist auch unter nuget.org/packages/LogExec verfügbar ). Dies macht genau die gleichen Dinge, die @ soner-gonul erwähnt hat - aber die Verwendung ist übersichtlich und verbirgt den gesamten Boilerplate-Code. Sehr hilfreich, wenn Sie es sehr häufig verwenden möchten. Außerdem wird Common.Logging verwendet, damit Sie es in Ihren bevorzugten Protokollierungsanbieter integrieren können.
Chai
1
@Habib können Sie mir bitte helfen zu verstehen, warum Thread.sleep (500) notwendig ist? Kann ich es nicht tun, wenn ich den Schlaf überspringe? Würde das es weniger effizient machen?
Md Sifatul Islam
8
@ Md.SifatulIslam, es besteht keine Notwendigkeit Thread.Sleep, es nur als Beispielcode zu verwenden, um Verzögerung anzuzeigen .... in der Tat sollten Sie vermeiden, Thread.Sleepirgendwo in Ihrem Code zu verwenden
Habib
59

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.

Soner Gönül
quelle
Kann es für die Ausführungszeit jeder Codezeile verwendet werden? zB: bindingSource.datasource = db.table; // Wie lange dauert es?
Vaheeds
2
@vaheeds Sicher. Beginnen Sie dies einfach Stopwatchüber jeder Zeile und stoppen Sie es nach jeder Zeile. Denken Sie daran, dass Sie Stopwatch.Resetzum Berechnen auch nach jeder einzelnen Zeile ein verwenden müssen. Basierend auf Ihrer Linie; Werfen
Soner Gönül
Ich habe einen kleinen Trick gemacht, um die Millisekunden aus dem Bild zu bekommen. auf diese Weise watch.Elapsed.ToString (). Split ('.') [0]
Doruk
2
@Doruk Ja, das können Sie tun oder Sie können benutzerdefinierte Zeichenfolgen für das Zeitspannenformat verwenden, wie stopwatch.Elapsed.ToString(@"d\.hh\:mm\:ss")es mir sauberer erscheint.
Soner Gönül
1
Beste Antwort. Vielen Dank!
Tadej
48

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 BenchmarkDotNet oder Benchmark.It oder NBench verwenden

Alex Erygin
quelle
3
Vielen Dank, beste Antwort bisher
Pixel
2
Danke, habe so zentral gesucht. Habe diese Strategie auch mit ActionFilter gemacht.
14.
13

Wenn Sie die Stopwatch-Klasse verwenden, können Sie die Watch mit der Methode .StartNew () auf 0 zurücksetzen. Sie müssen also nicht .Reset () gefolgt von .Start () aufrufen. Könnte nützlich sein.

ohgodnotanotherone
quelle
4

Die Stoppuhr wurde für diesen Zweck entwickelt und ist eine der besten Methoden zur Messung der Zeitausführung in .NET.

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.

Sam
quelle
3

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 ProcessThread.UserProcessorTimeProperty verwenden, das Sie unter dem System.DiagnosticsNamespace 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.

Shailesh Prajapati
quelle
0

Ich konnte keine vb.net-Version sehen, wie man die Stoppuhrklasse verwenden könnte, daher habe ich unten ein Beispiel angegeben.

        Dim Stopwatch As New Stopwatch

        Stopwatch.Start()
                    ''// Test Code
        Stopwatch.Stop()
        Console.WriteLine(Stopwatch.Elapsed.ToString)

        Stopwatch.Restart()            
                   ''// Test Again

        Stopwatch.Stop()
        Console.WriteLine(Stopwatch.Elapsed.ToString)

Ich hoffe, das hilft jedem, der bei dieser Frage auf der Suche nach vb.net angekommen ist.

Sägesinus
quelle