讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么计算程序运行时间 C++高精度计时器实现代码【测试】

陌辰酱_8910

陌辰酱_8910

发布时间:2026-02-01 19:22:02

|

261人浏览过

|

来源于php中文网

原创

std::chrono::high_resolution_clock是C++11起跨平台纳秒级计时首选,须用同一时钟的两个time_point相减得duration再转换单位;禁用编译器优化、避免绝对时间戳相减、长期监控应改用steady_clock。

c++怎么计算程序运行时间 c++高精度计时器实现代码【测试】

用 std::chrono::high_resolution_clock 获取纳秒级时间差

在 C++11 及以后,std::chrono::high_resolution_clock 是最常用、最便携的高精度计时方案。它不依赖系统 API,跨平台(Windows/Linux/macOS)行为一致,且精度通常达纳秒级(实际取决于硬件和 OS 调度,但测量差值足够可靠)。

关键点是:必须用同一个时钟的两个 time_point 相减,得到 duration,再转为所需单位(如毫秒、微秒)。直接用 time(NULL) 或 clock() 精度太低,且受 CPU 占用率影响大。

常见错误:把 high_resolution_clock::now().time_since_epoch().count() 当作绝对时间戳相减——这在某些实现中可能因时钟重置或单调性问题出错;正确做法始终用 operator- 得到 duration。

示例:

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

#include <chrono>
#include <iostream>
<p>auto start = std::chrono::high_resolution_clock::now();
// ... 你的代码
auto end = std::chrono::high_resolution_clock::now();</p><p>auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "耗时: " << duration.count() << " 微秒\n";

为什么不用 QueryPerformanceCounter 或 clock_gettime

这些是系统级 API,虽然底层精度高,但破坏了可移植性,且封装不当容易出错。比如 Windows 的 QueryPerformanceCounter 需要配合 QueryPerformanceFrequency 换算,若频率获取失败或未处理整数溢出,结果会偏差几个数量级;Linux 的 clock_gettime(CLOCK_MONOTONIC, ...) 虽稳定,但需手动处理 struct timespec,还涉及链接 -lrt。

除非你在写内核模块、实时系统或对纳秒抖动有极端要求(如高频交易),否则 std::chrono 完全够用,且编译器对其做了充分优化。实测中,high_resolution_clock 在主流编译器(MSVC/GCC/Clang)下生成的汇编与直接调用系统 API 几乎等价。

直播间话术巡检-windows
直播间话术巡检-windows

直播话术巡检系统(Windows版) — 实时语音转写、关键词检测、场景自动切换、告警推送、大屏可视化。支持 Windows VB-Cable 虚拟声卡音频采集,阿里云 ASR 实时识别。一键启动脚本,自动安装环境。

下载

注意:high_resolution_clock 在部分旧版 MinGW 或嵌入式 STL 中可能退化为 system_clock,可通过静态断言验证:

static_assert(std::chrono::high_resolution_clock::is_steady,
              "high_resolution_clock must be steady");

测试时避免编译器优化干扰计时结果

如果你测的是一个简单函数(比如排序小数组),编译器可能在 -O2 下整个优化掉,导致测出 0ns。这不是计时器不准,而是代码没执行。

解决方法:

  • 用 volatile 或 std::atomic 强制保留计算结果(例如把返回值存到 volatile int sink)
  • 将待测逻辑封装进函数,并禁用内联:[[gnu::noinline]](GCC/Clang)或 __declspec(noinline)(MSVC)
  • 运行多次取最小值或中位数,排除 OS 调度抖动(单次测量意义不大)

示例防优化写法:

[[gnu::noinline]] int compute_heavy() {
    int sum = 0;
    for (int i = 0; i < 1000000; ++i) sum += i * i;
    return sum;
}
<p>volatile int sink = compute_heavy(); // 防止被优化掉

跨平台计时库要不要引入?

像 Boost.Chrono 或 folly::Chrono 提供了更丰富的格式化和统计工具,但对单纯“测一段代码跑多久”属于过度设计。C++ 标准库的 chrono 已覆盖全部基础需求:构造、相减、转换、输出。

真正容易被忽略的是时钟的“稳定性”和“单调性”。high_resolution_clock 标准只要求它是“最高分辨率的可用时钟”,但未强制要求单调(即不保证不会倒流)。实践中,所有主流实现都基于单调时钟(如 Linux 的 CLOCK_MONOTONIC、Windows 的 QueryPerformanceCounter),但如果你做长时间运行的性能监控(小时级),建议显式使用 steady_clock ——它标准规定必须单调且不可逆。

所以,日常测试用 high_resolution_clock 没问题;长期服务监控请改用 std::chrono::steady_clock。

热门AI工具

更多
DeepSeek

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

Laper
Laper Hot

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

SkildArt
SkildArt Hot

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

WorkBuddy

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

豆包大模型

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

counta和count的区别
counta和count的区别

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

3268

2023.11.20

string转int
string转int

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

6539

2023.08.02

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

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

3185

2024.08.29

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

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

4088

2025.08.29

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

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

2805

2025.08.29

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

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

774

2025.10.23

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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