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ą Stop
metody?
EDYTOWAĆ
Należy pamiętać, że Logger.Log (..) nic nie kosztuje, ponieważ timer.Elapsed
jest odczytywany, zanim rejestrator się zaloguje.
Stop
metoda uniemożliwia beztroskich błędów, na przykład, jeśli jesteś ocenyElapsed
własności wielokrotnie.Stop
miałoby jakiekolwiek znaczenie? I tak nie możesz użyć tej wartościOdpowiedzi:
Nie, nie musisz tego przerywać.
Stop()
po prostu przestaje śledzić upływający czas. Nie zwalnia żadnych zasobów.źródło
Nie, nie ma potrzeby zatrzymywania go ani czyszczenia.
Stopwatch
nie 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 (naStart()
iStop()
, a podczas czytaniaElapsed
), aby pobrać sygnaturę czasową wysokiej rozdzielczości.W linuksowych implementacjach Mono i .NET Core używa
clock_gettime
funkcji do pobierania monotonicznie rosnącej wartości czasu.Dla każdego, kto jest naprawdę ciekawy szczegółów wdrożenia: przeczytaj ten post .
źródło
Myślę, że Stop jest przydatny, jeśli chcesz ponownie użyć wartości Elapsed.
źródło
Jeśli Twój kod nie wymaga obliczeń, nie musisz używać funkcji Stop ().
źródło