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

Linux C語言高精度計時:gettimeofday微秒級計時完整指南

     編輯:關於C語言

Linux下gettimeofday微秒級高精度計時詳解與實戰

在性能分析、基準測試、網絡延遲測量等場景中,微秒級計時是剛需。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 對比

現代替代方案:clock_gettime

// 多次運行取中位數減少抖動
#define BENCHMARK(func, iterations) do { \
    long times[iterations]; \
    for (int i = 0; i < iterations; i++) { \
        SimpleTimer t; timer_start(&t); \
        func(); \
        times[i] = timer_elapsed_us(&t); \
    } \
    qsort(times, iterations, sizeof(long), cmp_long); \
    printf("中位數: %ld us, 平均: %.1f us\n", \
           times[iterations/2], avg(times, iterations)); \
} while(0)

gettimeofday作為Linux計時的「瑞士軍刀」,雖然精度和單調性不如clock_gettime,但其普遍可用性、簡單接口、微秒級精度使其在快速原型、舊系統維護、簡單基準測試中仍具不可替代價值。掌握其時間差計算邏輯、借位處理、系統時間干擾特性,是寫出可靠計時代碼的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性gettimeofdayclock_gettime(CLOCK_MONOTONIC)
精度微秒(實際常達納秒)納秒
單調性非單調(受系統時間調整影響)單調(不受系統時間影響)
標準POSIX.1-2001POSIX.1-2001
推薦度舊代碼兼容、簡單場景新代碼首選、精度要求高
vDSO優化支持(用戶態調用)支持