linux统计函数执行时间应使用clock_gettime(clock_monotonic)获取纳秒级起止时间戳并相减;推荐封装为宏time_measure(func)自动打印耗时;避免使用仅统计cpu时间的clock()。

Linux中统计函数执行时间,核心是获取高精度起止时间戳并相减。关键不在于“封装函数本身”,而在于用合适的计时接口包裹目标函数的调用过程。
用clock_gettime获取纳秒级耗时
推荐使用CLOCK_MONOTONIC,它不受系统时间调整影响,适合测量持续时间:
- 调用
clock_gettime(CLOCK_MONOTONIC, &start)记录起点 - 执行待测函数
- 再调用
clock_gettime(CLOCK_MONOTONIC, &end)记录终点 - 计算差值:
(end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9
封装成通用计时宏或工具函数
避免每次重复写计时逻辑,可定义一个简洁宏:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
#define TIME_MEASURE(func) do { struct timespec s, e; clock_gettime(CLOCK_MONOTONIC, &s); func; clock_gettime(CLOCK_MONOTONIC, &e); double t = (e.tv_sec-s.tv_sec)+(e.tv_nsec-s.tv_nsec)/1e9; printf("'%s' took %.6f s\n", #func, t); } while(0)- 使用时直接写
TIME_MEASURE(your_function());,自动打印耗时
注意clock()的局限性
clock()返回的是CPU时间(进程在用户态+内核态占用的处理器时间),不是真实流逝时间:
- 若函数中有
sleep、I/O等待、被调度暂停,clock()不会计入这些空闲时间 - 多线程下
clock()行为与实现相关,POSIX未强制规定其是否包含子线程时间 - 因此它适合分析CPU密集型瓶颈,但不适合测端到端响应延迟
简单封装示例(C++类风格)
可定义轻量计时器类,便于复用:
- 构造时启动计时,析构或调用
elapsed()时返回秒数 - 内部用
timespec存储,避免浮点运算开销 - 支持多次调用
restart(),适合循环体内的单次耗时观察










