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.


1
Te Stopmetoda uniemożliwia beztroskich błędów, na przykład, jeśli jesteś oceny Elapsedwłasności wielokrotnie.
Tim Schmelter


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.


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 .


5

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.