0

0

C++怎么使用chrono计时_C++高精度时间测量【基准】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-03 09:55:13

|

453人浏览过

|

来源于php中文网

原创

std::chrono::high_resolution_clock 准确但易用错:因跨平台实现差异(如linux用clock_monotonic、windows用queryperformancecounter),其“高分辨率”不等于绝对精确,且必须用同一时钟类型采样相减,避免混用system_clock/steady_clock;测真实耗时应禁用优化、防死代码消除、取多次最小值;推荐steady_clock;duration_cast截断导致精度丢失;windows下15ms卡顿源于系统时钟粒度,默认约15.6ms。

c++怎么使用chrono计时_c++高精度时间测量【基准】

chrono::high_resolution_clock 为什么不准

它准,但你用错了——high_resolution_clock 在不同平台底层实现不同:Linux 通常是 clock_gettime(CLOCK_MONOTONIC),Windows 可能是 QueryPerformanceCounter,但它的「高分辨率」不等于「绝对精确」,更不保证跨平台行为一致。真正的问题常出在取差值的方式上。

  • 别用 system_clocksteady_clock 混着比——它们时间起点和单调性保障不同,相减可能得到负值或跳变
  • 必须用同一时钟类型做 time_point 的两次采样再相减,例如都用 steady_clock
  • 避免把 time_point 转成 time_t 再算差,会丢精度、引入时区/闰秒干扰

怎么测一段代码的真实耗时(无干扰)

核心是隔离测量环境:禁用编译器优化干扰、避免缓存/分支预测预热偏差、防止编译器直接删掉空循环。

  • volatile 或函数调用阻止死代码消除,比如 do_work(); asm volatile("" ::: "rax");
  • 单次测量意义不大,至少跑 3–5 次取最小值(排除系统调度抖动),别用平均值——它会被 GC、中断拖慢
  • 推荐用 steady_clock:它保证单调递增且不受系统时间调整影响,适合性能测量
auto start = std::chrono::steady_clock::now();
do_work();
auto end = std::chrono::steady_clock::now();
auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();

duration_cast 精度丢失的坑

duration_cast 是截断(truncation),不是四舍五入。从纳秒转毫秒时,小于 1000000 纳秒的部分直接丢弃,导致大量 sub-microsecond 操作全显示为 0ms。

Promethean AI
Promethean AI

艺术家与AI一起构建虚拟世界

下载
  • 想保留亚微秒信息?先转到 nanoseconds 或用 double 浮点时长: std::chrono::duration<double std::nano>(end - start).count()</double>
  • 不要嵌套 cast,比如 duration_cast<milliseconds>(duration_cast<nanoseconds>(d))</nanoseconds></milliseconds>——中间截断两次,误差放大
  • 注意 count() 返回的是整型,溢出风险在大时间跨度下存在(如 hoursint 只撑不到 25 天)

Windows 下 chrono 高频调用偶尔卡住 15ms

这不是 chrono 的 bug,而是 Windows 默认时钟粒度问题。系统计时器默认分辨率约 15.6ms,steady_clock 在某些旧版本或电源管理模式下会受其拖累。

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

  • 可临时提高系统时钟精度:调用 timeBeginPeriod(1)(需 winmm.lib),但会影响全局功耗,用完记得 timeEndPeriod(1)
  • 更稳妥的做法是用 QueryPerformanceCounter 手动封装,绕过 chrono 抽象层(尤其在实时性敏感场景)
  • 确认是否真被卡住:打印连续多次测量的差值分布,如果出现大量 0 + 少量 15–16ms 峰值,基本就是系统粒度锅

实际写基准测试时,最难控的从来不是怎么读时间,而是让被测代码真的在跑、没被优化掉、也不被其他线程抢走 CPU。chrono 本身很稳,但人容易在边界上栽跟头。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

201

2023.11.20

string转int
string转int

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

910

2023.08.02

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

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

597

2024.08.29

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

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

294

2025.08.29

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

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

210

2025.08.29

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

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

294

2025.08.29

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

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

105

2025.10.23

c++中volatile关键字的作用
c++中volatile关键字的作用

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

75

2025.10.23

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

64

2026.02.28

热门下载

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

精品课程

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

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20.2万人学习

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

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