在C#中取得執行時間

為了找出系統中的效能問題,各個函數的執行時間是一個參考的依據,本文紀錄如何在 C# 中知道區段的執行時間。

Stopwatch class

Stopwatch class 是專門用來測量區間內所耗用的時間,它在 System.Diagnostics namespace 中。

1
2
3
4
5
6
7
8
9
10
11
...
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 方法停止計時器。

1
2
3
4
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
// Some Code
stopWatch.Stop();

Stopwatch 也有提供單一指令初始化及啟動計時器的 StartNew 靜態方法,可以較為簡潔。

1
2
3
Stopwatch stopWatch = Stopwatch.StartNew();
// Some Code
stopWatch.Stop();

取得耗用時間

可以使用 ElapsedMilliseconds 屬性取得以毫秒為單位的耗用時間。

1
2
3
4
Stopwatch stopWatch = Stopwatch.StartNew();
// Some Code
stopWatch.Stop();
Console.WriteLine(stopWatch.ElapsedMilliseconds);

Stopwatch 還有提供格式為 TimeSpanElapsed 屬性,以及更精確的計時器刻度的 ElapsedTicks 屬性

重啟計時器

在開始計時器停止後如果叫用 Start 方法,計時器並不會被重製,時間會從原本的往上加:

1
2
3
4
5
6
7
8
9
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);
1
2
1003
2018

重啟計時器可以使用 Reset 方法。

1
2
3
4
5
6
7
8
9
10
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);
1
2
1007
1015

兩段一樣的代碼,執行時間不一定會相同,因此上面這個例子兩區段的時間是不會一樣的。

也可以使用單一指令 Restart 方法同時 ResetStart 計時器:

1
2
3
4
stopWatch.Restart();
Thread.Sleep(1000);
stopWatch.Stop();
Console.WriteLine(stopWatch.ElapsedMilliseconds);

範例程式碼

Gist

參考資料