Должен ли я останавливать секундомер в конце метода?

89

Представим, что у нас есть простые измерения, используя 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?
}

Согласно MSDN:

В типичном сценарии секундомера вы вызываете метод Start, затем в конечном итоге вызываете метод Stop , а затем проверяете прошедшее время с помощью свойства Elapsed.

Я не уверен, следует ли мне вызывать этот метод, когда меня больше не интересует экземпляр таймера. Должен ли я "разобраться" с помощью Stopметода?

РЕДАКТИРОВАТЬ

Имейте в виду, что Logger.Log (..) ничего не стоит, потому что timer.Elapsedон читается до того, как регистратор регистрирует.

Дариуш
источник
1
Этот Stopметод предотвращает ошибки по невнимательности, например, если вы оцениваете Elapsedсвойство несколько раз.
Тим Шмелтер,
3
Взгляните на источник: linksource.microsoft.com/#System/services/monitoring/…
Крис Вандермоттен
Поскольку таймер выходит за рамки, почему вы думаете, что вызов Stopбудет иметь какое-либо значение? Вы все равно не можете использовать это значение
умолчанию

Ответы:

81

Нет, тебе не нужно останавливаться. Stop()просто перестает отслеживать прошедшее время. Это не освобождает ресурсы.

Уриил
источник
4
Но в любом случае рекомендуется использовать его, чтобы избежать ошибок по неосторожности.
Тим Шмелтер
12
Это ничему не мешает, он создает секундомер в методе и не возвращает его, поэтому он не сможет потом его достать, чтобы «ошибиться».
Ронан Тибодау
21
Кроме того, секундомер не выполняет никакой работы и не потребляет циклы процессора между вызовами Start () и Stop (). Start () просто устанавливает отметку времени на текущее время, а Stop () вычисляет и сохраняет время, прошедшее с этого момента. См источника в CoreCLR: github.com/dotnet/corefx/blob/master/src/...
Сэме
41

Нет, не нужно останавливать или убирать его.

Stopwatchне использует никаких неуправляемых ресурсов (если вы подумали IDisposable). На самом деле он вообще не использует никаких ресурсов (кроме, конечно, памяти, используемой самим объектом)! Он также не потребляет процессор при измерении прошедшего времени!

В окнах реализаций .NET (полный .NET Framework, Mono, .NET ядра), он просто вызывает QueryPerformanceCounter()API Windows , когда это необходимо (на Start()и Stop()и при чтении Elapsed) , чтобы получить штамп времени с высоким разрешением.

В Linux-реализациях Mono и .NET Core он использует clock_gettimeфункцию для получения монотонно увеличивающегося значения времени.

Всем, кому интересны детали реализации: прочтите этот пост .

Мохаммад Дехган
источник
5

Я думаю, что Stop полезен, если вы хотите повторно использовать значение Elapsed.

vvv
источник
Но в моем примере мне не нужно :)
Дариуш
Тогда это здорово :), я должен был использовать «только». Класс не реализует интерфейс Dispose, поэтому очистка не должна запускаться.
vvv
2
@vvv Если хотите, можете добавить это к своему ответу - между ответом и комментариями есть кнопка с надписью «изменить».
По умолчанию
0

Если ваш код не требует вычислений, то использовать Stop () не нужно.

ssh
источник