承接前兩篇,本文著重於 Stopwatch 計時結束後的結果讀取,詳細比較三種屬性的精度與適用場景,並提供完整範例程式碼。
| 屬性 | 回傳型別 | 精度 | 適用場景 |
|---|---|---|---|
Elapsed | TimeSpan | 最高(100 奈秒) | 需精確時間間隔、格式化輸出 |
ElapsedMilliseconds | long(毫秒) | 中等 | 較長時間測量、不需亞毫秒精度 |
ElapsedTicks | long(計時器刻度) | 原始刻度 | 極高精度需求、自行換算頻率 |
注意:Stopwatch.Frequency 為每秒刻度數,TimeSpan.Ticks 單位固定為 100 奈秒,兩者不同。
using System;
using System.Diagnostics;
namespace StopWatchDemo
{
class Program
{
static void Main(string[] args)
{
Stopwatch timer = new Stopwatch();
long total = 0;
timer.Start();
for (int i = 1; i <= 10_000_000; i++)
total += i;
timer.Stop();
// 以 Elapsed.Ticks / 10 得到微秒數(1 Tick = 100ns = 0.1μs)
decimal microseconds = timer.Elapsed.Ticks / 10m;
Console.WriteLine($"執行時間:{microseconds:F1} 微秒");
// 輔助屬性示範
Console.WriteLine($"IsRunning:{timer.IsRunning}");
Console.WriteLine($"ElapsedMilliseconds:{timer.ElapsedMilliseconds} ms");
Console.WriteLine($"ElapsedTicks:{timer.ElapsedTicks}");
Console.WriteLine($"Frequency:{Stopwatch.Frequency} Hz");
}
}
}
StartNew():靜態工廠方法,等同 new Stopwatch().Start(),適合一次性計時。Reset():歸零計時器,配合 Start() 可重複使用同一實例。Stopwatch 為執行緒安全,但啟停操作非原子性,高併發場景需自行同步。選擇正確的 Stopwatch 屬性對效能分析至關重要。短微基準測試請用 Elapsed 或 ElapsedTicks;長時間監控則 ElapsedMilliseconds 足矣。善用 StartNew 簡化代碼,並注意 Frequency 在不同硬體上的差異。