time$ time ./test
real 0m2.033s # 掛鐘時間(壁鐘時間)
user 0m2.032s # 用戶態 CPU 時間
sys 0m0.000s # 內核態 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。