為了找出系統中的效能問題,各個函數的執行時間是一個參考的依據,本文紀錄如何在 C# 中知道區段的執行時間。
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 Code
stopWatch.Stop();
Stopwatch 也有提供單一指令初始化及啟動計時器的 StartNew
靜態方法,可以較為簡潔。
Stopwatch stopWatch = Stopwatch.StartNew();
// Some Code
stopWatch.Stop();
可以使用 ElapsedMilliseconds
屬性取得以毫秒為單位的耗用時間。
Stopwatch stopWatch = Stopwatch.StartNew();
// Some Code
stopWatch.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);
1003
2018
重啟計時器可以使用 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);
1007
1015
兩段一樣的代碼,執行時間不一定會相同,因此上面這個例子兩區段的時間是不會一樣的。
也可以使用單一指令 Restart
方法同時 Reset
及 Start
計時器:
stopWatch.Restart();
Thread.Sleep(1000);
stopWatch.Stop();
Console.WriteLine(stopWatch.ElapsedMilliseconds);
同步發表於 LimitlessPing