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

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


person Dariusz    schedule 10.06.2014    source источник
comment
Метод Stop предотвращает ошибки по невнимательности, например, если вы оцениваете свойство Elapsed несколько раз.   -  person Tim Schmelter    schedule 10.06.2014
comment
Взгляните на источник: referenceource.microsoft.com/ # System / services / monitoring /   -  person Kris Vandermotten    schedule 10.06.2014
comment
Поскольку таймер выходит за пределы области видимости, почему вы думаете, что вызов Stop будет иметь какое-либо значение? Вы все равно не можете использовать значение   -  person Default    schedule 10.06.2014


Ответы (4)


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

person Uriil    schedule 10.06.2014
comment
Но в любом случае рекомендуется использовать его, чтобы не допустить ошибок по невнимательности. - person Tim Schmelter; 10.06.2014
comment
Это ничему не мешает, он создает секундомер в методе и не возвращает его, поэтому он не сможет потом его достать, чтобы ошибиться. - person Ronan Thibaudau; 10.06.2014
comment
Кроме того, секундомер не выполняет никакой работы и не потребляет циклы процессора между вызовами Start () и Stop (). Start () просто устанавливает отметку времени на текущее время, а Stop () вычисляет и сохраняет время, прошедшее с этого момента. См. Исходный код в coreclr: github.com/dotnet/corefx/blob/master/src/ - person Sammi; 02.03.2016

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

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

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

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

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

person Mohammad Dehghan    schedule 31.01.2017

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

person vvv    schedule 10.06.2014
comment
Но в моем примере мне это не нужно :) - person Dariusz; 10.06.2014
comment
Тогда это здорово :), мне следовало использовать только Класс не реализует интерфейс Dispose, поэтому очистка не должна запускаться. - person vvv; 10.06.2014
comment
@vvv Если хотите, можете добавить это к своему ответу - между ответом и комментариями есть кнопка с надписью "Изменить". - person Default; 10.06.2014

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

person funbrain9    schedule 13.05.2020