为了找出系统中的效能问题,各个函数的执行时间是一个参考的依据,本文纪录如何在 C# 中知道区段的执行时间。
Stopwatch class
Stopwatch class 是专门用来测量区间内所耗用的时间,它在 System.Diagnostics
namespace 中。
...using System.Diagnostics;...class Program{ static void Main(string[] args) { Stopwatch stopWatch = new Stopwatch(); // System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); }}
上面的代码建立了一个 Stopwatch 的实体,记得加上 using System.Diagnostics;
,或是在叫用时包含命名空间。
启动与停止计时器
在想要计算的代码前使用 Start
方法启动,并在之后使用 Stop
方法停止计时器。
Stopwatch stopWatch = new Stopwatch();stopWatch.Start();// Some CodestopWatch.Stop();
Stopwatch 也有提供单一指令初始化及启动计时器的 StartNew
静态方法,可以较为简洁。
Stopwatch stopWatch = Stopwatch.StartNew();// Some CodestopWatch.Stop();
取得耗用时间
可以使用 ElapsedMilliseconds
属性取得以毫秒为单位的耗用时间。
Stopwatch stopWatch = Stopwatch.StartNew();// Some CodestopWatch.Stop();Console.WriteLine(stopWatch.ElapsedMilliseconds);
Stopwatch
还有提供格式为TimeSpan
的Elapsed
属性,以及更精确的计时器刻度的ElapsedTicks
属性。
重启计时器
在开始计时器停止后如果叫用 Start
方法,计时器并不会被重製,时间会从原本的往上加:
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();stopWatch.Start();Thread.Sleep(1000);stopWatch.Stop();Console.WriteLine(stopWatch.ElapsedMilliseconds);stopWatch.Start();Thread.Sleep(1000);stopWatch.Stop();Console.WriteLine(stopWatch.ElapsedMilliseconds);
10032018
重启计时器可以使用 Reset
方法。
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();stopWatch.Start();Thread.Sleep(1000);stopWatch.Stop();Console.WriteLine(stopWatch.ElapsedMilliseconds);stopWatch.Reset();stopWatch.Start();Thread.Sleep(1000);stopWatch.Stop();Console.WriteLine(stopWatch.ElapsedMilliseconds);
10071015
两段一样的代码,执行时间不一定会相同,因此上面这个例子两区段的时间是不会一样的。
也可以使用单一指令 Restart
方法同时 Reset
及 Start
计时器:
stopWatch.Restart();Thread.Sleep(1000);stopWatch.Stop();Console.WriteLine(stopWatch.ElapsedMilliseconds);
範例程式码
Gist
参考资料
StackOverflow: Calculate the execution time of a method.NET Documentation: Stopwatch 类别同步发表于 LimitlessPing