直接相减两个 time_point 得到 duration 类型,无需手动转毫秒;错误做法是强转 long long 计算,会丢失精度;正确做法是用 duration_cast 提取毫秒值。
std::chrono::duration 直接相减就能算时差,别手动转毫秒
两个 std::chrono::time_point 相减,结果就是 std::chrono::duration 类型,本质是“时间间隔”的强类型封装。不需要先转成毫秒或秒再做减法——那反而会丢失精度、引入截断误差。
常见错误是把 time_point 强制转成 long long 再计算:
auto t1 = std::chrono::steady_clock::now();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
auto t2 = std::chrono::steady_clock::now();
// ❌ 错误:强行转 long long 丢精度,且语义不清
auto diff_ms = (t2.time_since_epoch().count() - t1.time_since_epoch().count()) *
std::chrono::steady_clock::period::num /
std::chrono::steady_clock::period::den;
✅ 正确做法是直接相减,让类型系统帮你处理单位转换:
auto diff = t2 - t1; // 类型是 std::chrono::duration<..., ...> auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(diff).count();
-
duration支持直接 +、-、==、 - 不同 clock(如
steady_clock和system_clock)的time_point不能直接相减,编译报错 - 用
duration_cast转换时,向下取整(向零截断),若需四舍五入可先加半格再 cast
std::chrono::duration_cast 不是函数调用,是模板显式特化
std::chrono::duration_cast 是一个模板,不是普通函数。它在编译期决定如何缩放底层计数值,不涉及运行时开销。但写错模板参数会导致静默精度损失或编译失败。
立即学习“C++免费学习笔记(深入)”;
典型陷阱:
- 把
duration_cast<int></int>当成合法写法 —— 实际必须是duration类型,比如duration_cast<milliseconds></milliseconds> - 从高精度往低精度 cast(如纳秒 → 毫秒)会截断,但反向 cast(毫秒 → 纳秒)是安全的,只是补零
- 用
auto接收 cast 结果时,类型仍是duration,不是原始整数;要取数值必须调用.count()
示例: