0

0

C++中std::chrono::duration怎么计算时差_C++高精度时间间隔转换【手册】

穿越時空

穿越時空

发布时间:2026-02-08 12:21:08

|

457人浏览过

|

来源于php中文网

原创

直接相减两个 time_point 得到 duration 类型,无需手动转毫秒;错误做法是强转 long long 计算,会丢失精度;正确做法是用 duration_cast 提取毫秒值。

c++中std::chrono::duration怎么计算时差_c++高精度时间间隔转换【手册】

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(diff).count();
  • duration 支持直接 +、-、==、
  • 不同 clock(如 steady_clocksystem_clock)的 time_point 不能直接相减,编译报错
  • duration_cast 转换时,向下取整(向零截断),若需四舍五入可先加半格再 cast

std::chrono::duration_cast 不是函数调用,是模板显式特化

std::chrono::duration_cast 是一个模板,不是普通函数。它在编译期决定如何缩放底层计数值,不涉及运行时开销。但写错模板参数会导致静默精度损失或编译失败。

立即学习C++免费学习笔记(深入)”;

典型陷阱:

  • duration_cast 当成合法写法 —— 实际必须是 duration 类型,比如 duration_cast
  • 从高精度往低精度 cast(如纳秒 → 毫秒)会截断,但反向 cast(毫秒 → 纳秒)是安全的,只是补零
  • auto 接收 cast 结果时,类型仍是 duration,不是原始整数;要取数值必须调用 .count()

示例:

SciMaster
SciMaster

全球首个通用型科研AI智能体

下载
auto ns = std::chrono::nanoseconds(123456789);
auto ms = std::chrono::duration_cast(ns); // 123ms
auto count = ms.count(); // 类型是 long long,值为 123

跨单位转换容易踩的坑:ratio 和浮点精度

std::chrono::duration 的模板参数是 Rep(表示类型)和 Period(一个 std::ratio)。比如 millisecondsduration,其中 milli = ratio

当你自定义 duration 或混用单位时,要注意:

  • ratio(微秒)和 ratio(毫秒)之间转换,如果 Rep 是整数,除不尽就会截断
  • doubleRep 可保留小数,但会引入浮点误差,比如 duration 在长时间累加后可能失准
  • 避免用 duration_cast 在整数 Rep 和浮点 Rep 之间来回转,容易隐式溢出或精度坍塌

推荐做法:内部统一用整数 Rep(如 long long),只在最终输出或 UI 层才转成浮点秒或带小数的毫秒。

实际性能影响:duration 运算几乎零开销,但 cast 和 count 有隐含成本

duration 是纯类型包装,所有算术操作在编译期确定缩放逻辑,生成的汇编通常就是几条整数加减或移位指令。但以下操作有真实开销:

  • duration_cast 若目标单位与源单位不可整除(如纳秒 → 毫秒),需做整数除法(非移位),在某些嵌入式平台较慢
  • .count() 是 trivial 成员函数,但若后续拿这个值做大量浮点运算,要注意类型转换延迟
  • 频繁创建临时 duration 对象(尤其模板实例多时)可能略微增加编译时间和二进制体积,但对运行时无影响

高频场景(如游戏循环、实时日志打点)建议提前 cast 好并缓存,而不是每次都要 duration_cast(t2-t1).count()

真正难的是理解 period 的 rational 缩放关系,而不是写法本身。多数问题出在想当然地“除1000”或“乘1e6”,而忽略了 ratio 是编译期有理数,不是运行时浮点系数。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

626

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

552

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

173

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

205

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

173

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

104

2025.10.23

C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

305

2025.07.15

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.8万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 16.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号