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

Dar*_*usz 74 .net c# 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?
}
Run Code Online (Sandbox Code Playgroud)

根据MSDN:

在典型的秒表场景中,您调用Start方法,然后最终调用Stop方法,然后使用Elapsed属性检查已用时间.

当我不再对定时器实例感兴趣时,我不确定是否应该调用此方法.我应该"清理"使用Stop方法吗?

编辑

请记住,Logger.Log(..)不需要任何费用,因为在记录器记录之前timer.Elapsed会读取它.

Uri*_*iil 63

不,你不需要阻止它.Stop()只是停止追踪经过的时间.它不会释放任何资源

  • 秒表也没有做任何工作或在调用Start()和Stop()之间吃cpu时钟周期.Start()只是设置一个时间戳到现在,Stop()计算并保存从那时起经过的时间.请参阅coreclr中的source:https://github.com/dotnet/corefx/blob/master/src/System.Runtime.Extensions/src/System/Diagnostics/Stopwatch.cs/#L72 (18认同)
  • 它并没有阻止任何事情,他在方法中创造了秒表并且没有返回它,所以他以后无法控制它"犯错误". (9认同)
  • 但无论如何,使用它来防止粗心的错误是一种好习惯. (4认同)

Moh*_*han 30

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

Stopwatch不使用任何非托管资源(如果你想到的话IDisposable).它实际上根本不使用任何资源(当然,除了对象本身使用的内存)!

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

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

对任何对实现细节有好奇心的人:阅读这篇文章.


小智 5

I think Stop is useful if you want to reuse the Elapsed value.

  • @vvv 如果您愿意,可以将其添加到您的答案中 - 答案和评论之间有一个按钮,上面写着“编辑”。 (2认同)