0

0

如何使用c++的std::chrono进行高精度性能测量? (替代C风格time)

尼克

尼克

发布时间:2026-01-11 13:21:41

|

279人浏览过

|

来源于php中文网

原创

std::chrono::high_resolution_clock 并非总是纳秒级,实际精度需运行时检查分母;应测代码块而非单次调用,避免在循环内频繁调用 now() 以防止测量污染。

如何使用c++的std::chrono进行高精度性能测量? (替代c风格time)

std::chrono::high_resolution_clock 真的够高吗?

多数场景下,std::chrono::high_resolution_clock 是最接近硬件精度的时钟,但它在不同平台语义不同:Windows 上通常映射到 QueryPerformanceCounter(纳秒级),Linux 上常为 CLOCK_MONOTONIC(微秒或纳秒,取决于内核配置)。不能假设它一定返回纳秒——实际精度需运行时检查:

auto res = std::chrono::high_resolution_clock::period::den; // 分母,如 1000000000 表示纳秒
若结果是 1000000,说明底层只支持微秒。更稳妥的做法是统一用 std::chrono::nanoseconds 存储差值,让系统自动做精度截断或舍入。

如何避免测量误差:别在循环里反复调用 now()

频繁调用 now() 本身有开销,尤其在 tight loop 中会污染测量结果。正确做法是「测一段代码块」,而非「测单次函数调用」:

  • auto start = std::chrono::high_resolution_clock::now(); 记录起点
  • 执行待测逻辑(确保编译器不优化掉,必要时加 volatile 或用结果)
  • 再调用一次 now() 得终点,相减得 duration
  • 避免把 now() 放进被测循环内部——那测的是时钟开销,不是你的算法

例如,错误写法:

for (int i = 0; i < N; ++i) {
    auto t = std::chrono::high_resolution_clock::now(); // ❌ 每次都调用
    do_work();
}
正确写法:
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < N; ++i) {
    do_work();
}
auto end = std::chrono::high_resolution_clock::now(); // ✅ 只调两次

duration_cast 的陷阱:向下取整 vs 四舍五入

std::chrono::duration_cast 默认向零截断(即向下取整),比如 1234 ns 转成 std::chrono::microseconds 得到 1 μs,不是 1.234。若需要更准的浮点表示,应先转为 double 基础单位:

  • 要整数微秒:用 duration_cast<:chrono::microseconds>(end - start).count()
  • 要带小数的毫秒:用 std::chrono::duration(end - start).count()
  • 避免链式 cast:duration_cast(duration_cast(d)) 会多一次截断,直接 cast 到目标类型即可

常见误用:

auto d = end - start;
auto us = std::chrono::duration_cast(d).count(); // 截断后整数
auto us_f = std::chrono::duration(d).count(); // 保留小数,如 1234.567

跨线程 / 多核时要注意 clock 稳定性

high_resolution_clock 在某些老 CPU 或 BIOS 设置下可能受频率缩放影响(如 Intel SpeedStep),导致同一段代码在不同核心上测出差异较大的时间。若需严格可重现的性能数据:

行者AI
行者AI

行者AI绘图创作,唤醒新的灵感,创造更多可能

下载

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

  • 优先用 std::chrono::steady_clock(单调、不受系统时间调整影响,但精度可能略低)
  • Linux 下可绑定进程到固定 CPU 核并禁用节能:taskset -c 0 ./bench && echo performance | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
  • Windows 上建议关闭「快速启动」和「连接待机」,并在电源选项中设为「高性能」

真正难搞的不是写对代码,而是让硬件别偷偷降频——很多“性能波动”问题根源在此。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

196

2023.11.20

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

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

51

2025.08.29

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

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

98

2025.10.23

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

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

67

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

479

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

571

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1089

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

787

2023.08.01

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

80

2026.01.09

热门下载

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

精品课程

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

共48课时 | 6.9万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

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

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