在性能分析、基準測試、網絡延遲測量等場景中,微秒級計時是剛需。gettimeofday作為經典POSIX接口,提供微秒精度、簡單易用的特點,雖然現代系統推薦clock_gettime(CLOCK_MONOTONIC, ...),但理解gettimeofday仍是Linux C程序員必備基本功。
// 計算 time_diff = end - start
int timeval_subtract(struct timeval *result, struct timeval *start, struct timeval *end) {
if (start->tv_sec > end->tv_sec) return -1;
if (start->tv_sec == end->tv_sec && start->tv_usec > end->tv_usec) return -2;
result->tv_sec = end->tv_sec - start->tv_sec;
result->tv_usec = end->tv_usec - start->tv_usec;
// 處理微秒借位
if (result->tv_usec < 0) {
result->tv_sec--;
result->tv_usec += 1000000;
}
return 0;
}
實用封裝:計時器類
gettimeofday vs clock_gettime 對比
| 特性 | gettimeofday | clock_gettime(CLOCK_MONOTONIC) |
|---|---|---|
| 精度 | 微秒(實際常達納秒) | 納秒 |
| 單調性 | 非單調(受系統時間調整影響) | 單調(不受系統時間影響) |
| 標準 | POSIX.1-2001 | POSIX.1-2001 |
| 推薦度 | 舊代碼兼容、簡單場景 | 新代碼首選、精度要求高 |
| vDSO優化 | 支持(用戶態調用) | 支持 |