Sollte ich die Stoppuhr am Ende der Methode stoppen?


89

Stellen wir uns vor, wir haben einfache Messungen mit Stopwatch

public void DoWork()
{
    var timer = Stopwatch.StartNew();
    // some hard work
    Logger.Log("Time elapsed: {0}", timer.Elapsed);
    timer.Stop(); // Do I need to call this?
}

Laut MSDN:

In einem typischen Stoppuhrszenario rufen Sie die Start-Methode auf, rufen schließlich die Stop-Methode auf und überprüfen dann die verstrichene Zeit mithilfe der Elapsed-Eigenschaft.

Ich bin mir nicht sicher, ob ich diese Methode aufrufen soll, wenn ich mich nicht mehr für die Timer-Instanz interessiere. Soll ich mit der StopMethode "aufräumen" ?

BEARBEITEN

Beachten Sie, dass Logger.Log (..) nichts kostet, da timer.Elapsedes gelesen wird, bevor der Logger protokolliert.


1
Die StopMethode verhindert unachtsame Fehler, beispielsweise wenn Sie die ElapsedEigenschaft mehrmals bewerten .
Tim Schmelter


Warum glauben Sie, dass ein Anruf Stopeinen Unterschied machen würde, da der Timer nicht mehr funktioniert? Sie können den Wert sowieso nicht verwenden
Standard

Antworten:


81

Nein, du musst es nicht aufhalten. Stop()hört einfach auf, die verstrichene Zeit zu verfolgen. Es werden keine Ressourcen freigesetzt.


4
Es ist jedoch empfehlenswert, es trotzdem zu verwenden, um unachtsame Fehler zu vermeiden.
Tim Schmelter

12
Es verhindert nichts, er erstellt die Stoppuhr in der Methode und gibt sie nicht zurück, sodass er sie später nicht mehr finden kann, um "Fehler zu machen".
Ronan Thibaudau

21
Außerdem erledigt eine Stoppuhr zwischen den Aufrufen von Start () und Stop () keine Arbeit oder frisst keine CPU-Taktzyklen. Start () setzt nur einen Zeitstempel auf jetzt und Stop () berechnet und speichert die seitdem verstrichene Zeit. Siehe Quelle in coreclr: github.com/dotnet/corefx/blob/master/src/…
Sammi

41

Nein, es ist nicht nötig, es anzuhalten oder aufzuräumen.

Stopwatchverwendet keine nicht verwalteten Ressourcen (wenn Sie daran gedacht haben IDisposable). Es werden tatsächlich überhaupt keine Ressourcen verwendet (außer natürlich dem vom Objekt selbst verwendeten Speicher)! Es verbraucht auch keine CPU, während die verstrichene Zeit gemessen wird!

In Windows - Implementierungen von .NET (full .NET Framework, Mono, .NET Core), ruft nur die QueryPerformanceCounter()Windows - API bei Bedarf (auf Start()und Stop()und beim Lesen Elapsed) eine hohe Auflösung Zeitstempel abzurufen.

In Linux-Implementierungen von Mono und .NET Core wird die clock_gettimeFunktion verwendet, um einen monoton ansteigenden Zeitwert abzurufen.

Für alle, die wirklich neugierig auf die Implementierungsdetails sind: Lesen Sie diesen Beitrag .


5

Ich denke, Stop ist nützlich, wenn Sie den abgelaufenen Wert wiederverwenden möchten.


Aber ich brauche in meinem Beispiel nicht :)
Dariusz

Dann ist es großartig :), ich hätte "nur" verwenden sollen. Die Klasse implementiert keine Dispose-Schnittstelle, daher sollte keine Bereinigung ausgelöst werden.
vvv

2
@vvv Wenn Sie möchten, können Sie dies zu Ihrer Antwort hinzufügen - zwischen der Antwort und den Kommentaren befindet sich eine Schaltfläche mit der Aufschrift "Bearbeiten".
Standard

0

Wenn Ihr Code nicht berechnet werden muss, müssen Sie Stop () nicht verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.