首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 精準測量程式執行時間與 CPU 時間差異解析

     編輯:關於C#

為什麼要區分「實際時間」與「CPU 時間」?

在效能分析與高效能伺服器開發中,常見需求是統計「每秒處理多少封包」。直覺公式是 總處理封包數 / 總耗時,但這裡的「耗時」若混淆了 實際經過時間 與 CPU 佔用時間,結論可能會誤導優化方向。

核心觀念差異

指標取得方式意義
實際經過時間Stopwatch.Elapsed從開始到結束的牆鐘時間,包含等待、I/O、排程切換
CPU 時間Process.GetCurrentProcess().TotalProcessorTime執行緒真正佔用 CPU 運算的總和,不含等待時間

實測程式碼

private void ShowRunTime()
{
    // 取得起始 CPU 時間
    TimeSpan cpuStart = Process.GetCurrentProcess().TotalProcessorTime;

    // 實際時間用 Stopwatch
    Stopwatch sw = Stopwatch.StartNew();

    int circles = 1000;
    for (int i = 0; i < circles; ++i)
    {
        Console.WriteLine(i.ToString()); // 包含 I/O 等待
    }

    sw.Stop();
    // 計算 CPU 時間差
    double cpuMs = Process.GetCurrentProcess().TotalProcessorTime.Subtract(cpuStart).TotalMilliseconds;

    Console.WriteLine($"迴圈次數:{circles} CPU時間(ms)={cpuMs:F3} 實際時間(ms)={sw.Elapsed.TotalMilliseconds:F3}");
    Console.WriteLine($"1 tick = {sw.Elapsed.TotalMilliseconds / sw.Elapsed.Ticks:F6} 毫秒");
}

典型輸出與分析

迴圈次數:1000 CPU時間(ms)=50.072 實際時間(ms)=666.907
1 tick = 0.000100 毫秒

兩者相差 13 倍!主因有二:

  1. 多工排程:Windows 以執行緒為單位分時多工,程式執行中途可能被剝奪 CPU 給其他程序。
  2. I/O 等待:Console.WriteLine 內部涉及非同步 I/O,呼叫執行緒在等待完成期間不佔用 CPU,但實際時間持續流逝。

效能測量最佳實務

  • 基準測試:以 實際經過時間 為主指標,CPU 時間為輔助參考。
  • 差距大時:檢查是否有過多 I/O、鎖競爭、GC 暫停或外部相依服務延遲。
  • 工具選擇:.NET Stopwatch 精度達 0.1 微秒(視硬體而定),足夠應付大多數微基準測試。

總結

理解「牆鐘時間」與「CPU 時間」的定義差異,能避免在效能分析時誤判瓶頸位置,進而採取正確的優化策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved