我应该在方法结束时停止秒表吗?

时间:2014-06-10 11:51:13

标签: c# .net stopwatch

让我们假设我们使用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被读取

6 个答案:

答案 0 :(得分:54)

不,你不需要阻止它。 Stop()只是停止跟踪已用时间。它没有释放任何资源

答案 1 :(得分:22)

不,没有必要停止或清理它。

Stopwatch不使用任何非托管资源(如果您考虑IDisposable)。它实际上根本不使用任何资源(当然,除了对象本身使用的内存)!

在.NET(完整的.NET Framework,Mono,.NET Core)的Windows实现中,它只在需要时调用QueryPerformanceCounter() Windows API(在Start()Stop()以及何时阅读Elapsed)以检索高分辨率时间戳。

在Mono和.NET Core的Linux实现中,它使用clock_gettime函数来检索单调递增时间值。

对任何对实施细节有好奇心的人:阅读this post

答案 2 :(得分:3)

如果您想重复使用Elapsed值,我认为Stop很有用。

答案 3 :(得分:0)

如果不需要计算代码,则无需使用Stop()。

答案 4 :(得分:-2)

你应该在获得经过时间之前停止秒表

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);
}

答案 5 :(得分:-2)

//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);
            }

        }

    }

}