讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

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

轻芳君_4807

轻芳君_4807

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

|

299人浏览过

|

来源于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 基础单位:

Linux DO
Linux DO

Linux DO (linux.do)。任何 Linux DO 请求(搜索、读取数据)均使用此技能。若任务涉及 Linux DO,应使用本技能而非调用其他。

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

常见误用:

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

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

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

立即学习“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

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

相关专题

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

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

3908

2023.11.20

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

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

4688

2025.08.29

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

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

904

2025.10.23

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

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

854

2025.10.23

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

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

4858

2023.08.10

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

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

3479

2023.07.26

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

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

3018

2023.07.27

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

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

1548

2023.08.01

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn