std::chrono 获取带小数秒差值应避免 duration_cast<seconds> 截断,而用 duration_cast<duration<double>> 或 count() 除以 period::den;std::difftime 因 time_t 精度限制不适用于亚秒场景。

用 std::chrono 获取带小数秒的差值
直接用 std::chrono::duration_cast 转成 std::chrono::seconds 会丢精度——它截断小数部分,不是四舍五入。要保留浮点秒,得先转成 std::chrono::duration<double></double> 或显式除以 std::chrono::duration<double>::period::den</double>。
典型做法是:两个 std::chrono::time_point 相减得到 duration,再用 .count() 拿到底层 tick 数,最后除以每秒 tick 数:
auto diff = end_tp - start_tp; double seconds = diff.count() * static_cast<double>(diff.period::num) / diff.period::den;
但更简洁安全的是直接转成浮点秒 duration:
auto seconds = std::chrono::duration_cast<:chrono::duration>>(end_tp - start_tp).count();</:chrono::duration>- 这个写法自动处理了不同 clock 的 tick 周期(比如
system_clock通常是纳秒级,steady_clock可能是纳秒或微秒) - 注意:必须用
duration<double></double>,不能用duration<float></float>——float 在大时间跨度下会丢失毫秒级精度
别用 std::difftime ——它只支持 time_t 整秒
std::difftime 返回 double,但输入是 time_t,而 time_t 通常只精确到秒(POSIX 要求其为算术类型,但未规定精度;实践中多数系统是秒级整数)。哪怕你用 clock_gettime 拿到纳秒级时间,转成 time_t 也会砍掉小数部分。
立即学习“C++免费学习笔记(深入)”;
- 现象:
std::difftime(t2, t1)对毫秒级差异返回0.0 - 场景:需要测量函数执行耗时、网络 RTT、传感器采样间隔等亚秒级场景时,
std::difftime完全不可用 - 替代方案:坚持用
std::chrono::high_resolution_clock+duration_cast浮点转换
high_resolution_clock 不一定“高分辨率”,检查实际 tick 周期
标准不保证 std::chrono::high_resolution_clock 是最高精度的 clock;在某些平台(如旧版 MSVC),它可能只是 system_clock 的别名,tick 周期为 100ns 或更大。真正需要纳秒级精度时,应验证其周期:
using HR = std::chrono::high_resolution_clock; std::cout << "tick period: " << HR::period::num << "/" << HR::period::den << " s\n";
常见结果:
- Linux g++/clang:
1/1000000000(纳秒) - Windows MSVC(较旧):
1/10000000(100 纳秒) - 如果输出是
1/1,说明该 clock 实际是秒级——必须换用steady_clock或平台 API(如clock_gettime(CLOCK_MONOTONIC, ...))
跨线程或长时间运行时,避免用 system_clock
system_clock 对应系统时间,可能被 NTP 调整、用户手动修改或夏令时切换影响,导致差值异常(比如突然跳变 -1 秒或 +1 秒)。对测量耗时这类场景,它不可靠。
- 正确选择:
std::chrono::steady_clock—— 单调递增,不受系统时间调整影响 - 例外:只有当你明确要计算“墙上时间”差(例如日志时间戳差、定时任务到期时刻)才用
system_clock - 注意:
steady_clock的 epoch 无意义,不能转成可读时间字符串;但它的时间差绝对可靠
浮点秒差本身不难算,难点在于 clock 选错、精度误判、或把整秒函数当亚秒用——这些坑比代码多两行还容易踩。


















