Чи слід зупиняти секундомір наприкінці методу?


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власності кілька разів.
Тім Шмельтер


Оскільки таймер виходить за межі обсягу, чому ви вважаєте, що дзвінок Stopможе щось змінити? Ви все одно не можете використовувати значення
за замовчуванням

Відповіді:


81

Ні, не потрібно це зупиняти. Stop()просто зупиняє відстеження минулого часу. Це не звільняє жодних ресурсів.


4
Але корисно використовувати його в будь-якому випадку, щоб запобігти необережним помилкам.
Тім Шмельтер

12
Це нічого не заважає, він створює секундомір у методі і не повертає його, тому згодом він не зможе його взяти, щоб "помилитися".
Ронан Тібаудо,

21
Крім того, Секундомір не виконує жодної роботи та не їсть цикли годинника процесора між дзвінками на Пуск () та Стоп (). 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

Я думаю, що зупинка корисна, якщо ви хочете повторно використати значення Elapsed.


Але мені не потрібно у своєму прикладі :)
Даріуш

Тоді це чудово :), я повинен був використовувати "тільки" Клас не реалізує інтерфейс Dispose, тому жодне очищення не повинно запускатись.
vvv

2
@vvv Якщо ви хочете, можете додати це до своєї відповіді - між відповіддю та коментарями є кнопка "редагувати".
За замовчуванням

0

Якщо ваш код не потребує обчислення, тоді не потрібно використовувати Stop ().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.