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


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

EDIT

имейте в виду, что регистратор.Бревно.(.) ничего не стоит, потому что timer.Elapsed читать до журналы регистратора.

5 54

5 ответов:

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

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

Stopwatch не использует никаких неуправляемых ресурсов (если вы подумали о IDisposable). Он на самом деле не использует любой ресурсы вообще!

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

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

для тех, кто с реальным любопытством о деталях реализации: читать этот пост.

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

вы должны остановить секундомер, прежде чем получить истекшее время

static void Main()
{
// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();

// Begin timing
stopwatch.Start();

// Do something
for (int i = 0; i < 1000; i++)
{
    Thread.Sleep(1);
}

// Stop timing
stopwatch.Stop();

// Write result
Console.WriteLine("Time elapsed: {0}",
    stopwatch.Elapsed);
}
//disposable StopWatch
internal class StopWatch :Stopwatch, IDisposable
{

    public StopWatch()
    {

        Start();

    }

    private string _name;

    public string Name
    {
        get => _name;
        set => _name = $"{value} ";
    }

    public void Dispose()
    {

        Stop();

        Debug.Print(string.Format("{0}RunTime {1:00}:{2:00}:{3:00}.{4:00}", Name, Elapsed.Hours, Elapsed.Minutes,Elapsed.Seconds, Elapsed.Milliseconds / 10));

    }

}

//Use example
internal class SomeClass
{

    private static void Some()
    {

        using (var stopWatch = new StopWatch())
        {

            // Do something
            for (int i = 0; i < 1000; i++)
            {
                Thread.Sleep(1);
            }

        }

    }

}