当前位置: 首页 > java >正文

C/C++STL---<chrono>

C++ 的 <chrono> 库是一个强大的时间处理库,提供了高精度的时间测量、时钟操作和时间点计算功能

1. 基本概念

1.1 时间单位(Duration)

std::chrono::duration 表示时间间隔,由 计数值时间单位 组成。

  • 常用类型
    using nanoseconds  = duration<long long, nano>;      // 纳秒
    using microseconds = duration<long long, micro>;     // 微秒
    using milliseconds = duration<long long, milli>;     // 毫秒
    using seconds      = duration<long long>;            // 秒
    using minutes      = duration<int, ratio<60>>;       // 分钟
    using hours        = duration<int, ratio<3600>>;     // 小时
    
  • 自定义 Duration
    using days = duration<int, ratio<86400>>;  // 天(24*60*60秒)
    
  • 转换
    seconds s(1);
    milliseconds ms = duration_cast<milliseconds>(s);  // 显式转换
    auto ms_approx = s * 1000;  // 隐式转换(可能截断)
    
1.2 时间点(Time Point)

std::chrono::time_point 表示某个特定时刻,由 时钟类型时间间隔 组成。

  • 常用操作
    using namespace std::chrono;
    time_point<system_clock> now = system_clock::now();  // 当前时间点
    time_point<system_clock> later = now + hours(1);      // 1小时后
    duration<double> diff = later - now;                  // 时间差(秒)
    
1.3 时钟(Clock)

时钟提供当前时间点,包含三个关键类型:

  • now():返回当前时间点。
  • duration:时钟的时间单位。
  • is_steady:是否为稳定时钟(即时间是否单调递增)。

三种标准时钟

  1. system_clock:系统实时时钟,支持与 time_t 互转:
    time_t t = system_clock::to_time_t(now);  // 转 time_t
    time_point<system_clock> tp = system_clock::from_time_t(t);  // 转 time_point
    
  2. steady_clock:稳定时钟,适合测量时间间隔(如性能测试):
    auto start = steady_clock::now();
    // ... 代码执行 ...
    auto end = steady_clock::now();
    cout << "耗时: " << duration_cast<milliseconds>(end - start).count() << "ms\n";
    
  3. high_resolution_clock:高精度时钟(通常是 system_clocksteady_clock 的别名)。

2. 高级用法

2.1 自定义时钟

通过继承 std::chrono::clock 可以创建自定义时钟:

struct my_clock {using duration = std::chrono::milliseconds;using rep = duration::rep;using period = duration::period;using time_point = std::chrono::time_point<my_clock>;static constexpr bool is_steady = true;static time_point now() noexcept;  // 实现当前时间获取
};
2.2 休眠与等待

结合 std::this_thread::sleep_forstd::condition_variable 使用:

// 休眠3秒
std::this_thread::sleep_for(seconds(3));// 等待条件变量,最多500毫秒
std::condition_variable cv;
std::mutex m;
bool ready = false;
cv.wait_for(std::unique_lock<std::mutex>(m), milliseconds(500), [&]{ return ready; });
2.3 时间点算术

支持时间点的加减运算:

time_point<steady_clock> tp = steady_clock::now();
tp += minutes(2) + seconds(30);  // 2分30秒后
tp -= hours(1);                  // 1小时前

3. C++20 新增特性

3.1 日历与时区

引入 std::chrono::zoned_time 和日历组件(如 year_month_day):

#include <chrono>
#include <iostream>using namespace std::chrono;int main() {// 当前时间点auto now = system_clock::now();// 获取本地时区auto local_tz = current_zone();// 转换为本地时间zoned_time local_time(local_tz, now);std::cout << "本地时间: " << local_time << '\n';// 构建特定日期auto date = year(2023) / month(10) / day(1);std::cout << "日期: " << date << '\n';return 0;
}
3.2 格式化输出

使用 std::formatstd::chrono::format 格式化时间点:

auto now = system_clock::now();
std::cout << std::format("{:%Y-%m-%d %H:%M:%S}", now);  // 输出:2023-10-01 12:34:56

4. 性能考虑

  • 精度与开销:高精度时钟(如 high_resolution_clock)可能有更高的系统开销。
  • 跨平台差异:不同系统的时钟实现可能有细微差异,尤其是 high_resolution_clock

5. 常见应用场景

  1. 性能测试
    auto start = steady_clock::now();
    // 执行测试代码
    auto end = steady_clock::now();
    std::cout << "代码执行耗时: " << (end - start).count() << "纳秒\n";
    
  2. 超时控制
    future<int> f = std::async([]{ return 42; });
    if (f.wait_for(seconds(1)) == std::future_status::ready) {std::cout << "结果: " << f.get() << '\n';
    } else {std::cout << "超时\n";
    }
    

总结

<chrono> 库通过 durationtime_pointclock 三个核心组件,提供了类型安全、高精度的时间处理能力。从简单的时间间隔测量到复杂的时区转换,该库覆盖了几乎所有时间相关的场景,是现代 C++ 开发中不可或缺的工具。

http://www.xdnf.cn/news/8517.html

相关文章:

  • [SWPUCTF 2021 新生赛]简简单单的解密
  • CDGA|一线二线企业数据治理项目目前发展状况
  • 运维实施36-逻辑卷管理 (LVM)
  • 【国产OS】国产麒麟OS部署个人方法汇总
  • VirtualBox 4.3.10 经典版安装教程 - Windows 7/10 下载与设置指南
  • GESP编程等级认证C++三级8-字符串1
  • 【Day34】
  • 一文详解 HLS
  • siparmyknife:SIP协议渗透测试的瑞士军刀!全参数详细教程!Kali Linux教程!
  • Python 训练营打卡 Day 33
  • AI浪潮下,媒体内容运营的五重变奏
  • 安卓新建项目时,Gradle下载慢下载如何用国内的镜像
  • 什么是Express
  • MCP Server 实践之旅第 3 站:MCP 协议亲和性的技术内幕
  • Vue组件化与生命周期:打造灵活高效的前端积木世界
  • 低代码平台搭建
  • VueRouter路由组件的用法介绍
  • Seismic source model -- Brune model ( ω^2 model)
  • 有两个Python脚本都在虚拟环境下运行,怎么打包成一个系统服务,按照顺序启动?
  • 班迪录屏--解决视频剪辑时声音和画面不同步的问题
  • 【COMSOL超材料和超表面仿真设计】
  • Gemma 3n:更智能、更快速、随时离线的AI新纪元
  • leetcode3434. 子数组操作后的最大频率-medium
  • Google Play 账号创建及材料准备
  • 详解MySQL锁机制
  • Python实现栈和队列及其应用场景解析
  • 继续对《道德经》第57章至第81章进行数学形式化建模
  • 高压电工工作内容详解
  • 【PhysUnits】8 关联常量泛型(constant/mod.rs)
  • Oracle 11g导出数据库结构和数据