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


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:

在典型的Stopwatch方案中,您调用Start方法,然后最终调用Stop方法,然后使用Elapsed属性检查经过时间。

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

编辑

请记住,Logger.Log(..)不花费任何费用,因为在记录器记录之前timer.Elapsed被读取。


1
Stop方法可防止出现粗心的错误,例如,如果要Elapsed多次评估属性。
Tim Schmelter 2014年


由于计时器超出范围,您为什么认为调用Stop会有什么不同?无论如何,您都无法使用该值
默认

Answers:


81

不,您不需要停止它。Stop()只是停止跟踪经过的时间。它不会释放任何资源。


4
但是,无论如何都要使用它来防止粗心的错误是一个好习惯。
Tim Schmelter 2014年

12
它并不能阻止任何事情,他在方法中创建了秒表并且没有返回它,所以他以后将无法掌握它以“犯错”。
Ronan Thibaudau 2014年

21
另外,在调用Start()和Stop()之间,秒表没有做任何工作或占用CPU时钟周期。Start()只是将时间戳记设置为现在,而Stop()会计算并保存从那以后经过的时间。参见coreclr中的源代码:github.com/dotnet/corefx/blob/master/src/…–
Sammi

41

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

Stopwatch不使用任何非托管资源(如果您想到了IDisposable)。实际上,它根本不使用任何资源(当然,对象本身使用的内存除外)!在测量经过时间时,它也不会消耗任何CPU!

在.NET(.NET Framework全,单声道,.NET的核心)的Windows实现,它只是调用QueryPerformanceCounter()需要的时候的Windows API(上Start()Stop()读取时Elapsed),以获取较高分辨率的时间戳。

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

如果您对实现细节有真正的好奇心,请阅读此文章


5

我想如果您想重用Elapsed值,则Stop很有用。


但在我的示例中,我不需要:)
Dariusz 2014年

那太好了:),我应该使用“ only”该类未实现Dispose接口,因此不应触发任何清理。
vvv 2014年

2
@vvv如果愿意,可以将其添加到答案中-答案和注释之间有一个按钮,显示“编辑”。
默认值

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.