gettimeofday 比 time(NULL) 多了微秒级精度和 struct timeval 结构封装,支持高精度计时与打点;直接替换会因返回值类型不同(int vs time_t)导致编译错误,需正确使用指针参数。

gettimeofday 比 time(NULL) 多了什么
time(NULL) 只能返回秒级时间戳,精度固定为 1 秒;gettimeofday 返回 struct timeval,包含秒(tv_sec)和微秒(tv_usec),精度通常到微秒级(实际取决于系统实现,常见为毫秒或微秒)。如果你需要测量函数耗时、做高精度日志打点、或避免因秒级截断导致的时序误判,gettimeofday 是合理替代。
直接替换 time(NULL) 会出错吗
会。最常见错误是类型不匹配:time(NULL) 返回 time_t(通常是 long int),而 gettimeofday 不返回时间戳,它把结果写入传入的 struct timeval* 指针中,返回值是 int(成功为 0,失败为 -1)。直接写 time_t t = gettimeofday(...) 编译就报错。
- 正确用法:先声明
struct timeval tv,再调用gettimeofday(&tv, NULL) - 获取秒级时间戳可取
tv.tv_sec,它和time(NULL)值一致(忽略时区/闰秒等细微差异) - 第二个参数是
struct timezone*,POSIX 已废弃,必须传NULL,否则行为未定义
Linux 下 gettimeofday 的性能和替代建议
在较新内核(2.6.32+)和 glibc 中,gettimeofday 实际走的是 vDSO(virtual Dynamic Shared Object),不触发系统调用,开销极低(几十纳秒级),比 time(NULL) 略高但基本可忽略。但它仍是 C 风格接口,C++ 项目更推荐:
- 用
std::chrono::system_clock::now()(C++11 起),类型安全、可读性好、精度由实现保证(通常也是微秒或纳秒) - 若需兼容旧代码或跨平台受限,
gettimeofday仍可用,但注意它在 macOS 上已标记为 deprecated,未来可能移除 - 不要用
clock_gettime(CLOCK_REALTIME, ...)单纯替代time(NULL)——它更重,且多一个参数,没必要
一个安全的秒级时间封装示例
如果只是想“无缝升级” time(NULL) 为更高精度但保持接口不变,可以这样封装:
立即学习“C++免费学习笔记(深入)”;
time_t my_time(time_t* t) {
struct timeval tv;
if (gettimeofday(&tv, NULL) == 0) {
if (t) *t = tv.tv_sec;
return tv.tv_sec;
}
// 失败时回退(罕见,但需处理)
time_t fallback = time(NULL);
if (t) *t = fallback;
return fallback;
}注意:这个函数不解决时区、闰秒、NTP 调整等问题;真正需要可靠时间语义的场景(如金融、日志审计),应统一使用 clock_gettime(CLOCK_REALTIME_COARSE) 或更高层级的时间服务,而不是在 time() 和 gettimeofday() 之间反复横跳。


















