709 Stimmen

Berechnung der Ausführungszeit einer Methode

Mögliches Duplikat:
Wie kann ich messen, wie lange eine Funktion läuft?

Ich habe eine zeitraubende E/A-Methode, die Daten von einem Ort zu einem anderen kopiert. Wie lässt sich die Ausführungszeit am besten und realistischsten berechnen? Thread ? Timer ? Stopwatch ? Gibt es eine andere Lösung? Ich möchte die genaueste und kürzeste Lösung so weit wie möglich.

1476voto

Darin Dimitrov Punkte 990883

Stopwatch wurde für diesen Zweck entwickelt und ist eine der besten Möglichkeiten zur Messung der Ausführungszeit in .NET.

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

Nicht DateTime verwenden zur Messung der Ausführungszeit in .NET.


UPDATE:

Wie von @series0ne im Kommentarbereich angemerkt: Wenn Sie eine wirklich präzise Messung der Ausführung eines Codes wünschen, müssen Sie die in das Betriebssystem eingebauten Leistungszähler verwenden. Die folgende Antwort enthält eine schöne Übersicht.

96voto

Matthew Layton Punkte 35129

Aus persönlicher Erfahrung kann ich sagen, dass die System.Diagnostics.Stopwatch Klasse kann jedoch verwendet werden, um die Ausführungszeit einer Methode zu messen, HINWEIS : Das ist nicht ganz richtig!

Betrachten Sie das folgende Beispiel:

Stopwatch sw;

for(int index = 0; index < 10; index++)
{
    sw = Stopwatch.StartNew();
    DoSomething();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

sw.Stop();

Beispielhafte Ergebnisse

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

Jetzt fragen Sie sich das; "Und warum hat es beim ersten Mal 132 ms gedauert und beim zweiten Mal deutlich weniger?"

Die Antwort lautet, dass Stopwatch kompensiert nicht die "Hintergrundgeräusche" in .NET, wie z.B. JITing. Wenn Sie Ihre Methode also zum ersten Mal ausführen, wird sie von .NET zuerst gejittet. Die dafür benötigte Zeit wird zur Ausführungszeit hinzugerechnet. Auch andere Faktoren können dazu führen, dass die Ausführungszeit variiert.

Was Sie wirklich für absolute Genauigkeit suchen sollten, ist Leistungsprofilierung !

Werfen Sie einen Blick auf das Folgende:

RedGate ANTS Performance Profiler ist ein kommerzielles Produkt, das jedoch sehr genaue Ergebnisse liefert. - Steigern Sie die Leistung Ihrer Anwendungen mit .NET-Profiling

Hier ist ein StackOverflow-Artikel über Profilerstellung: - Was sind einige gute .NET-Profiler?

Ich habe auch einen Artikel über Performance Profiling mit Stopwatch geschrieben, den Sie sich vielleicht ansehen möchten. Leistungsprofilierung in .NET

42voto

Soner Gönül Punkte 93790

StopWatch Klasse sucht nach Ihrer besten Lösung.

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

Außerdem hat es ein statisches Feld namens Stopwatch.IsHighResolution . Dies ist natürlich eine Frage der Hardware und des Betriebssystems.

Zeigt an, ob der Timer auf einer hochauflösenden Leistung basiert Zähler basiert.

21voto

Jeff Foster Punkte 41930

Wenn Sie daran interessiert sind, die Leistung zu verstehen, ist die beste Antwort die Verwendung eines Profilers.

Ansonsten, System.Diagnostics.StopWatch bietet einen hochauflösenden Timer.

14voto

Nach diesem Microsoft Doc :

using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}

Ausgabe: RunTime 00:00:09.94

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X