C++如何获取程序已运行的时间 _ chrono库高精度实现【实战】

风萱君_2184

风萱君_2184

2026-04-08

1001人浏览

原创

最可靠方式是用 static const auto program_start = std::chrono::steady_clock::now(); 在 main 开头或全局作用域初始化,后续用 duration_cast 转换单位后计算差值,避免 system_clock 和非静态局部初始化导致的时钟跳变或竞态。

c++如何获取程序已运行的时间 _ chrono库高精度实现【实战】

用 std::chrono 获取程序已运行时间,最可靠的方式是记录启动时刻,之后用当前时刻减去它——不是读系统时间,也不是靠 clock(),因为后者受 CPU 调度、多线程抢占影响大,精度和语义都不够稳。

如何在程序启动时记录起始时间点

把 std::chrono::steady_clock::now() 存进一个全局或静态变量里,确保它在 main() 开头就执行。别用 system_clock,它可能被系统管理员调时,导致差值跳变;steady_clock 才是专为测量间隔设计的。

常见错误:在函数内首次调用时才初始化,结果多线程下可能重复赋值或竞态;或者用 auto start = std::chrono::system_clock::now();,后续遇到 NTP 同步就会出负值或突变。

  • 推荐写法:
    static const auto program_start = std::chrono::steady_clock::now();
  • 如果必须放函数里(比如封装成工具类),加 static 修饰并确保只初始化一次
  • 不要在 DLL/so 的全局对象构造器中做这事——加载顺序不可控,steady_clock::now() 可能尚未就绪

怎么算出“已运行多少秒/毫秒/微秒”

用当前时间减去 program_start,再通过 duration_cast 转成你需要的单位。注意:直接用 .count() 拿到的是底层时钟滴答数(可能是纳秒级整数),不转换单位就打印会严重误导。

典型误用:auto d = std::chrono::steady_clock::now() - program_start; std::cout —— 这输出的是纳秒数,不是秒。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 要秒:
    std::chrono::duration_cast<:chrono::seconds>(d).count()</:chrono::seconds>
  • 要毫秒(常用):
    std::chrono::duration_cast<:chrono::milliseconds>(d).count()</:chrono::milliseconds>
  • 要带小数的秒(如用于日志):
    std::chrono::duration<double>(d).count()</double>
  • 避免反复 cast:如果高频调用(如每帧测时),先 cast 成 double 或 int64_t 缓存,别每次重算

为什么不用 clock() 或 gettimeofday()

clock() 返回的是进程 CPU 时间,不是真实流逝时间;多线程下它累加所有线程的占用,且在 Windows 上分辨率常只有 10–15ms;Linux 上虽可到微秒,但语义仍是 CPU 时间,程序 sleep 时它几乎不动。而 gettimeofday() 是系统时间,会被 NTP 校正、手动改时打乱,不能用于测间隔。

实测对比:程序 sleep(5),clock() 可能只增加几毫秒;gettimeofday() 若中途被校准 -1 秒,差值就变负;steady_clock 则稳定增长约 5000ms。

  • clock() 适合分析某段代码占用了多少 CPU 资源
  • steady_clock 才适合回答“程序已经跑了多久”这个物理时间问题
  • Windows 下 QueryPerformanceCounter 和 Linux 下 clock_gettime(CLOCK_MONOTONIC) 是 steady_clock 的底层实现,你不用操心跨平台细节

真正要注意的不是“怎么写”,而是“在哪记起点”和“怎么转单位”。起点记晚了(比如进了某个函数才记),后面所有时间都偏小;单位转错了(比如该用 milliseconds 却用了 seconds),数值差三个数量级。这两个点错一个,结果就完全不可信。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

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

相关专题

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

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

2023.11.20

3708

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2398

7

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

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

2023.08.10

4678

6

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

2025.12.24

1309

20

java多线程相关教程合集
java多线程相关教程合集

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

2026.01.21

443

30

C++多线程相关合集
C++多线程相关合集

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

2026.01.21

579

24

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

429

20

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

2026.03.16

273

22

Java 多线程与并发编程实战
Java 多线程与并发编程实战

深入讲解 Java 并发编程体系,涵盖 Thread / Runnable / Callable 线程创建方式、线程生命周期与状态转换、synchronized 同步锁与 Lock/ReentrantLock 显式锁、volatile 可见性保证、ThreadPool 线程池配置与调优(核心参数/拒绝策略)、JUC 并发工具类(CountDownLatch/CyclicBarrier/Semaphore/ConcurrentHashMa

2026.04.17

389

31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习