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

獲取程序執行時間三部曲:掛鐘/用戶/系統時間的命令與API實現

     編輯:關於C

一條命令搞定:time

$ time ./test
real    0m2.033s   # 掛鐘時間(壁鐘時間)
user    0m2.032s   # 用戶態 CPU 時間
sys     0m0.000s   # 內核態 CPU 時間
  • real:從啟動到結束的流逝時間,含 I/O 等待、調度延遲。
  • user:進程在用戶態佔用的 CPU 累計時間。
  • sys:進程在內核態(系統調用)佔用的 CPU 累計時間。

代碼級嵌入:times() 系統調用

適用於無法使用外部 `time` 命令(如嵌入式、守護進程、自動化測試框架)的場景。

核心結構體

struct tms {
    clock_t tms_utime;   // 用戶態 CPU 時間
    clock_t tms_stime;   // 系統態 CPU 時間
    clock_t tms_cutime;  // 子進程用戶態時間
    clock_t tms_cstime;  // 子進程系統態時間
};

完整封裝示例


#include 
#include 
#include 

static struct tms tms_start, tms_end;
static clock_t c_start, c_end;

void debug_times_start(void) {
    memset(&tms_start, 0, sizeof(tms_start));
    memset(&tms_end, 0, sizeof(tms_end));
    c_start = times(&tms_start);  // 返回值為開機至今的嘀嗒數(掛鐘時間基準)
}

void debug_times_end(void) {
    c_end = times(&tms_end);
    printf("clock time: %ld, user/system cpu time: %ld/%ld\n",
           c_end - c_start,
           tms_end.tms_utime - tms_start.tms_utime,
           tms_end.tms_stime - tms_start.tms_stime);
}

關鍵細節

  • times() 返回值單位為 嘀嗒(clock tick),非秒。轉秒需除以 sysconf(_SC_CLK_TCK)(通常 100 或 1000)。
  • 掛鐘時間 c_end - c_start 受系統負載影響大,僅作參考;CPU 時間較能反映算法效率。
  • 若需高精度(納秒級),可改用 clock_gettime(CLOCK_MONOTONIC, ...)(POSIX.1-2001)或 getrusage()(BSD 擴展,含頁錯誤、上下文切換等豐富統計)。

對比速查表

方法精度適用場景可移植性
shell `time`毫秒快速人工測試所有 UNIX/Linux
`times()`嘀嗒(~10ms)進程內嵌入、舊系統POSIX.1 (SVr4)
`getrusage()`微秒詳細資源統計BSD / Linux
`clock_gettime()`納秒高精度基準測試POSIX.1-2001

總結

按需選擇:命令行快跑用 `time`,自動化回歸集成用 `times()`/`getrusage()`,微基準測試用 `clock_gettime()`。記住 real ≠ user + sys,多核並行時 user+sys 甚至可超過 real。

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