Czy powinienem zatrzymać stoper na końcu metody?

89

Wyobraźmy sobie, że mamy proste pomiary przy użyciu 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?
}

Według MSDN:

W typowym scenariuszu Stopwatch wywołujesz metodę Start, a następnie ostatecznie wywołujesz metodę Stop , a następnie sprawdzasz upływający czas przy użyciu właściwości Elapsed.

Nie jestem pewien, czy powinienem wywołać tę metodę, gdy nie jestem już zainteresowany wystąpieniem timera. Czy powinienem "wyczyścić" za pomocą Stopmetody?

EDYTOWAĆ

Należy pamiętać, że Logger.Log (..) nic nie kosztuje, ponieważ timer.Elapsedjest odczytywany, zanim rejestrator się zaloguje.

Dariusz
źródło
1
Te Stopmetoda uniemożliwia beztroskich błędów, na przykład, jeśli jesteś oceny Elapsedwłasności wielokrotnie.
Tim Schmelter
3
Spójrz na źródło: referenceource.microsoft.com/#System/services/monitoring/ ...
Kris Vandermotten
Skoro czasomierz wykracza poza zakres, dlaczego uważasz, że wywołanie Stopmiałoby jakiekolwiek znaczenie? I tak nie możesz użyć tej wartości
domyślna

Odpowiedzi:

81

Nie, nie musisz tego przerywać. Stop()po prostu przestaje śledzić upływający czas. Nie zwalnia żadnych zasobów.

Uriil
źródło
4
Ale dobrą praktyką jest używanie go i tak, aby zapobiec nieostrożnym błędom.
Tim Schmelter
12
Niczego nie przeszkadza, tworzy stoper w metodzie i nie zwraca go, więc nie będzie mógł go później złapać i „popełnić błędów”.
Ronan Thibaudau
21
Również Stoper nie wykonuje żadnej pracy ani nie zjada cykli zegara procesora między wywołaniami Start () i Stop (). Start () po prostu ustawia znacznik czasu na teraz, a Stop () oblicza i zapisuje czas, który upłynął od tego czasu. Zobacz źródło w coreclr: github.com/dotnet/corefx/blob/master/src/…
Sammi
41

Nie, nie ma potrzeby zatrzymywania go ani czyszczenia.

Stopwatchnie używa żadnych niezarządzanych zasobów (jeśli o tym pomyślałeś IDisposable). W rzeczywistości w ogóle nie używa żadnych zasobów (oprócz oczywiście pamięci używanej przez sam obiekt)! Nie zużywa również żadnego procesora podczas pomiaru upływającego czasu!

W oknach implementacji .NET (pełny Framework, Mono, .NET rdzenia), to właśnie nazywa QueryPerformanceCounter()Windows API w razie potrzeby (na Start()i Stop(), a podczas czytania Elapsed), aby pobrać sygnaturę czasową wysokiej rozdzielczości.

W linuksowych implementacjach Mono i .NET Core używa clock_gettimefunkcji do pobierania monotonicznie rosnącej wartości czasu.

Dla każdego, kto jest naprawdę ciekawy szczegółów wdrożenia: przeczytaj ten post .

Mohammad Dehghan
źródło
5

Myślę, że Stop jest przydatny, jeśli chcesz ponownie użyć wartości Elapsed.

vvv
źródło
Ale nie potrzebuję w moim przykładzie :)
Dariusz
W takim razie jest super :), powinienem był użyć „tylko” Klasa nie implementuje interfejsu Dispose, więc żadne czyszczenie nie powinno być wyzwalane.
vvv,
2
@vvv Jeśli chcesz, możesz dodać to do swojej odpowiedzi - między odpowiedzią a komentarzami znajduje się przycisk „edytuj”.
Domyślnie
0

Jeśli Twój kod nie wymaga obliczeń, nie musisz używać funkcji Stop ().

ssh
źródło