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

122

假设我们使用 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(..)不会产生任何费用,因为logger在记录之前读取了 timer.Elapsed

1
Stop 方法可以防止您犯下粗心的错误,例如多次评估 Elapsed 属性。 - Tim Schmelter
3
请查看源代码:http://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Stopwatch.cs - Kris Vandermotten
由于计时器超出了范围,您为什么认为调用“Stop”会有任何区别?无论如何,您都无法使用该值。 - default
@default 我认为OP担心保持秒表开启是否会消耗资源。不清楚计时器是否在后台线程中运行。 - nawfal
4个回答

121

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


4
然而,使用它仍然是一个好习惯,可以避免粗心的错误。 - Tim Schmelter
16
它没有防止任何事情,他是在方法中创建了秒表并没有返回它,所以他以后将无法掌控它以便“犯错误”。 - Ronan Thibaudau
41
在调用Start()和Stop()之间,秒表不会执行任何操作或消耗CPU时钟周期。 Start()仅将时间戳设置为现在,而Stop()则计算并保存自那时以来经过的时间。请参见coreclr中的源代码: https://github.com/dotnet/corefx/blob/master/src/System.Runtime.Extensions/src/System/Diagnostics/Stopwatch.cs/#L72 - Sámal Rasmussen
我认为,从设计角度来看,最好写成using var stopwatch = Stopwatch.StartNew();而不是调用.Start()然后.Stop并在中间处理异常 :) - JobaDiniz
@JobaDiniz Stopwatch不是IDisposable。 - nawfal
显示剩余2条评论

73
不需要停止或清理它。
如果你想到了IDisposable,Stopwatch并不使用任何非托管资源。实际上,它根本不使用任何资源(当然除了对象本身所使用的内存)!同时它在测量经过的时间时也不会占用任何CPU!
在.NET的Windows实现中(包括完整的.NET Framework、Mono和.NET Core),Stopwatch只会在需要时(即在调用Start()Stop()以及读取Elapsed时)调用 QueryPerformanceCounter() Windows API 以获取高精度时间戳。
在Linux的Mono和.NET Core实现中,Stopwatch使用clock_gettime函数来获取一个单调递增的时间值。
对于任何对实现细节有真正好奇心的人,可以阅读这篇文章

4

如果你想重复使用已经经过的时间,那么我认为Stop是很有用的。


但是在我的例子中我不需要 :) - Dariusz
1
那太好了 :), 我应该使用 "only" 该类没有实现Dispose接口,因此不应触发任何清理。 - vvv
3
如果您愿意,可以将此添加到您的答案中 - 在答案和评论之间有一个按钮,上面写着“编辑”。 - default

-2
如果你的代码不需要计算,那么就不需要使用Stop()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接