如何使用clock_gettime计算命令执行耗时并输出三位小数秒格式
错误原因
- 成员名误用:
struct timespec的亚秒级成员是单位为纳秒的tv_nsec,你代码里用的tv_usec是struct timeval的微秒级成员,读取到的是无效内存值,导致计算结果错误。 - 单位换算逻辑错误:你把计算得到的微秒/纳秒值直接作为秒数输出,比如3秒对应的微秒值是3000000,直接输出自然会得到3000000+s的错误结果。
- 格式化字符串错误:
%.3lds的格式说明符和long long类型的变量不匹配,同时没有做单位转换,无法得到秒级三位小数的输出效果。
修正方案
方案1:浮点数转换(代码简洁,适合绝大多数场景)
struct timespec tsstart, tsend; clock_gettime(CLOCK_MONOTONIC, &tsstart); // 可执行程序/命令执行逻辑 clock_gettime(CLOCK_MONOTONIC, &tsend); // 换算为秒级浮点数,tv_nsec除以1e9转成秒 double realtime = (tsend.tv_sec - tsstart.tv_sec) + (tsend.tv_nsec - tsstart.tv_nsec) / 1000000000.0; printf("real: %.3lfs\n", realtime);
方案2:整数拆分输出(避免浮点数精度损失,适合对精度要求极高的场景)
struct timespec tsstart, tsend; clock_gettime(CLOCK_MONOTONIC, &tsstart); // 可执行程序/命令执行逻辑 clock_gettime(CLOCK_MONOTONIC, &tsend); long sec_diff = tsend.tv_sec - tsstart.tv_sec; long nsec_diff = tsend.tv_nsec - tsstart.tv_nsec; // 处理纳秒差值为负的边界情况 if (nsec_diff < 0) { sec_diff--; nsec_diff += 1000000000; } // 纳秒转毫秒,补前导零保证三位小数 printf("real: %ld.%03lds\n", sec_diff, nsec_diff / 1000000);
内容的提问来源于stack exchange,提问作者needshelpwithcoding
相关产品推荐
相关产品推荐

