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

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++ 开发中不可或缺的工具。

相关文章:

  • redis功能清单
  • 【Unity】使用InputSystem实现UI控件与键盘输入绑定以及如何快速制作虚拟摇杆
  • Pycharm和Flask的学习心得(7)
  • 236.二叉树的最近公共祖先
  • python web开发-Flask模板引擎Jinja2完全指南
  • 进一步学习线程相关知识
  • vue3中使用computed
  • Python 爬虫之requests 模块的应用
  • Vue组件通信的 `$attrs`与`$listeners`的优先级
  • 高效大型语言模型推理优化综述
  • Reason-ModernColBERT论文速览:Sentence- bert-基于孪生bert网络的句子嵌入
  • 基于SpringBoot+Vue的家政服务系统源码适配H5小程序APP
  • 人脸识别流程与算法对比报告
  • ES 面试题系列「三」
  • (已开源-CVPR2024) RadarDistill---NuScenes数据集Radar检测第一名
  • Java—— IO流的应用
  • OpenLayers 加载鼠标位置控件
  • 电子人的分水岭-FPGA模电和数电
  • CMSIS-NN:2.神经网络到CMSIS-NN的转换
  • TypeScript 完全指南(三):工程化实战,搭建高效 TS 项目架构
  • 网站运营专员做六休一/seo优化推广
  • 网页设计开发招聘/怎么优化推广自己的网站
  • wordpress模板大全/上海免费关键词排名优化
  • 牡丹花网站建设策划书/全网推广的方式有哪些
  • 一个域名对应多个网站/竞价是什么意思
  • 校园网站首页模板/如何提高自己的营销能力