0

0

c++如何计算程序运行时间_c++高精度计时器实现【核心】

尼克

尼克

发布时间:2026-02-13 13:28:02

|

949人浏览过

|

来源于php中文网

原创

最可靠方式是用 std::chrono::steady_clock,它单调稳定、跨平台、不依赖系统 api;linux 下底层调用 clock_gettime(clock_monotonic),windows 下基于 queryperformancecounter,精度通常达 10–15 纳秒。

c++如何计算程序运行时间_c++高精度计时器实现【核心】

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

最可靠、跨平台、且不依赖系统 API 的方式是使用 C++11 起标准库的 std::chrono。它能直接访问高精度时钟(通常是硬件计数器),精度可达纳秒级,但实际分辨率取决于系统——Linux/Windows 下通常为 10–15 纳秒左右。

关键不是“能不能到纳秒”,而是“两次读取之间的时间差是否稳定、单调、无跳变”。std::chrono::high_resolution_clock 满足这点,而 system_clock 可能因 NTP 调整跳变,steady_clock 更保守但保证单调,多数场景推荐后者。

实操建议:

  • std::chrono::steady_clock 测量运行时间,避免系统时间被修改干扰
  • 起始和结束时间必须用同一时钟类型,否则 duration_cast 可能静默出错
  • 别用 time_since_epoch().count() 做绝对时间比较,只用差值
  • 示例:
    auto start = std::chrono::steady_clock::now();
    // ... your code ...
    auto end = std::chrono::steady_clock::now();
    auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();

Windows 下误用 GetTickCount64 导致 16ms 误差

GetTickCount64 返回的是系统启动以来的毫秒数,但默认系统定时器分辨率只有 15.625ms(即 1000/64 Hz)。哪怕你调用两次只隔几微秒,结果也可能完全一样,或突变 16ms——这不是函数 bug,是 Windows 内核节拍(tick)机制决定的。

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

除非显式调用 timeBeginPeriod(1) 提升系统分辨率(需管理员权限,且影响全局电源管理),否则它不适合测短于 10ms 的代码段。

常见错误现象:

简篇AI排版
简篇AI排版

AI排版工具,上传图文素材,秒出专业效果!

下载
  • 循环中反复测同一小段代码,GetTickCount64 返回值不变,算出耗时为 0
  • 多次运行结果在 0 / 16 / 32 ms 间跳变,无法反映真实开销
  • std::chrono 结果相差一个数量级,误以为自己代码“突然变快”

Linux 下 clock_gettime(CLOCK_MONOTONIC)chrono 底层实现

glibc 的 std::chrono::steady_clock 在 Linux 上基本就是对 clock_gettime(CLOCK_MONOTONIC) 的封装。它绕过系统时间、不受 adjtimex 影响,且分辨率通常优于 gettimeofday(后者基于 CLOCK_REALTIME,可能跳变)。

如果你写 C 风格代码或需要极致控制,可以直接调用:

struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
// ... code ...
clock_gettime(CLOCK_MONOTONIC, &end);
long long ns = (end.tv_sec - start.tv_sec) * 1000000000LL + (end.tv_nsec - start.tv_nsec);

注意点:

  • CLOCK_MONOTONIC_RAW 更接近硬件计数器,但可能有漂移;一般用 CLOCK_MONOTONIC 即可
  • 别用 CLOCK_PROCESS_CPUTIME_ID 测“CPU 时间”——它统计线程实际占用 CPU 的时间,若代码大量等待 I/O 或被调度抢占,结果会远小于墙钟时间
  • 返回值是 timespec,计算纳秒差时注意 tv_nsec 可能借位(end.tv_nsec ),上面示例已处理

重复测量时,编译器优化会让 chrono 测出 0ns

如果被测代码不含 volatile 操作、无副作用、且结果未被使用,现代编译器(如 GCC -O2、Clang)可能直接优化掉整段逻辑——此时 std::chrono 测出来的就是“空循环开销”,甚至 0。

这不是计时器不准,是你没让编译器“相信这段代码必须执行”。解决方法:

  • 把关键计算结果写入 volatile 变量(简单但略重)
  • asm volatile("" ::: "memory") 插入编译器屏障(轻量,阻止重排和消除)
  • 将结果输出到 stdout / stderr(IO 有副作用,编译器不敢删)
  • 更严谨的做法:用 do { /* code */ } while(0) 包裹,并确保每次运行都依赖前次输出(如累加到全局变量)

没有这些防护,你看到的“12ns”可能只是时钟读取指令本身的延迟,而不是你写的算法耗时。

真正难的不是拿到两个时间戳,而是确保中间那段代码没被优化、没被调度打断、也没被缓存效应扭曲。高精度计时器只是尺子,尺子再准,量的不是你想量的东西,就没意义。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

199

2023.11.20

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

102

2023.09.25

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

85

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

101

2025.09.18

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

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

70

2025.10.23

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

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

673

2023.08.10

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

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

1088

2023.07.26

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

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

1147

2023.07.27

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

23

2026.02.13

热门下载

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

精品课程

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

共94课时 | 9.3万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.5万人学习

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

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