我应该在方法结束时停止秒表吗?
让我们想象一下,使用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:
在典型的秒表scheme中,您调用Start方法, 然后最终调用Stop方法 ,然后使用Elapsed属性检查已用时间。
我不确定当我不再对timer实例感兴趣时是否应该调用这个方法。 我应该使用Stop
方法“清除”吗?
编辑
请记住,Logger.Log(..) timer.Elapsed
任何费用,因为timer.Elapsed
是在logging器日志之前读取的。
不,你不需要阻止它。 Stop()
只是停止跟踪已用时间。 这不会释放任何资源
不,不需要停止或清理。
Stopwatch
不使用任何非托pipe资源(如果您认为IDisposable
)。 它实际上根本不使用任何资源!
在.NET Framework的windows实现中,只需要时(在Start()
和Stop()
以及读取Elapsed
)调用QueryPerformanceCounter()
Windows API来检索高分辨率时间戳。
在其他实现(Linux和maxOS上的Mono和.NET Core)中,也应该使用相同的OS调用。
我认为停止是有用的,如果你想重用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); } } } }
在获得Elapased时间之前,您应该停止秒表
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); }