clock_gettime 更准因支持纳秒级硬件时钟(如clock_monotonic),不受系统时间跳变影响;time()仅秒级,gettimeofday()微秒级但已废弃且精度受限;需链接-librt。

clock_gettime 为什么比 time() 或 gettimeofday() 更准
因为 clock_gettime 能访问硬件级高精度时钟源(比如 CLOCK_MONOTONIC 或 CLOCK_REALTIME),纳秒级分辨率,且不受系统时间跳变影响(CLOCK_MONOTONIC 尤其适合测时长)。而 time() 只到秒,gettimeofday() 虽到微秒但已废弃,且部分内核下实际精度受限于 jiffies。
必须链接 -lrt 才能用 clock_gettime
Linux 下 clock_gettime 不在默认 libc 中,而是放在 librt(realtime library)里。不加链接选项会报 undefined reference to 'clock_gettime'。
- 编译命令必须带
-lrt:g++ -o test test.cpp -lrt - 如果用 CMake,得加
target_link_libraries(your_target rt) - 注意顺序:
-lrt要放在源文件或目标文件之后,否则链接器可能忽略
选对 clock_id:CLOCK_MONOTONIC vs CLOCK_REALTIME
CLOCK_REALTIME 对应系统“墙上时间”,会被 settimeofday() 或 NTP 调整;CLOCK_MONOTONIC 从系统启动开始单调递增,不受人为修改影响,更适合计时、超时、性能测量。
示例(获取纳秒级单调时间):
#include <time.h>
#include <stdio.h><p>int main() {
struct timespec ts;
if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
printf("sec=%ld, nsec=%ld\n", ts.tv_sec, ts.tv_nsec);
}
return 0;
}
</p></stdio.h></time.h>
-
ts.tv_nsec是 0–999999999 范围,不是微秒;别直接当成毫秒用 - 跨平台时注意:
CLOCK_MONOTONIC在旧内核(CLOCK_REALTIME - 如果要测函数耗时,务必两次调用都用同一个
clock_id,混用会导致结果错乱
struct timespec 的 tv_nsec 容易溢出或误算
计算两个 timespec 差值时,不能简单相减 tv_nsec,因为后一次的 tv_nsec 可能小于前一次(秒进位未体现)。
- 正确做法:先算总纳秒差:
(end.tv_sec - start.tv_sec) * 1000000000LL + (end.tv_nsec - start.tv_nsec) - 或者用
diff.tv_sec = end.tv_sec - start.tv_sec;,再处理diff.tv_nsec = end.tv_nsec - start.tv_nsec;,若为负则diff.tv_sec--;且diff.tv_nsec += 1000000000; - 别用
double强转做除法来算毫秒——浮点误差在高频测量中会累积
精度本身没问题,但怎么安全读、怎么正确减、怎么选时钟源,这三块漏掉任何一块,测出来的时间就可能不准或不可复现。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











