兩種時間的差異
- 實際經過時間 (Wall-clock):
Stopwatch 測量,包含等待、I/O、排程切換等所有時間。
- CPU 時間:
Process.GetCurrentProcess().TotalProcessorTime 取得,僅包含執行緒實際佔用 CPU 的時間。
測試程式碼
private void ShowRunTime()
{
TimeSpan cpuStart = Process.GetCurrentProcess().TotalProcessorTime;
var sw = Stopwatch.StartNew();
const int Circles = 1000;
for (int i = 0; i < Circles; i++)
Console.WriteLine(i);
double cpuMs = Process.GetCurrentProcess().TotalProcessorTime.Subtract(cpuStart).TotalMilliseconds;
sw.Stop();
Console.WriteLine($"迴圈次數:{Circles} CPU時間(ms)={cpuMs:F3} 實際時間(ms)={sw.Elapsed.TotalMilliseconds:F3}");
Console.WriteLine($"1 tick = {sw.Elapsed.TotalMilliseconds / sw.Elapsed.Ticks:F6} ms");
}
輸出範例
迴圈次數:1000 CPU時間(ms)=50.072 實際時間(ms)=666.907
1 tick = 0.000100 ms
差異原因分析
- 多任務排程:Windows 依執行緒分時輪詢,程式執行中可能被剝奪 CPU 給其他程序。
- 等待不佔用 CPU:
Console.WriteLine 內部涉及 I/O 等待,此期間不佔用 CPU 但消耗實際時間。
結論與建議
- 效能測量以實際時間為主,CPU 時間作為輔助參考。
- 若兩者差距極大,需檢視是否存在過多 I/O、鎖競爭、排程延遲等問題。
Stopwatch 精度可達 0.1 微秒 (1/10,000 ms),滿足大多數測量需求。