C++ std::chrono 时间库简记

默认分类 · 2024-06-17 · 132 人浏览

chrono 是 C++ 标准库中的一个命名空间,包含了一组用于处理时间和时间相关操作的类和函数

头文件

#include <chrono>

基本组成

Durations(时间段)

用来表示一个时间段, duration类是一个模板类,它的模板定义如下

template <class Rep, class Period = std::ratio<1>> 
class duration;
  • Rep 为一种数值类型,duration用这个类型来表示 Period 的数量,比如int float double
  • Period 表示用秒表示时间单位的类型, ratio 这个类用来表示一个比例, 有两个参数,第一个为分zi,第二个为分母, 第二个默认值为 1, 比如 ratio<1, 1> 就代表一秒, ratio<60, 1> 就代表一分钟, ratio<1, 1000>代表一毫秒。

    • 常用的duration也可以使用预设好的如下,都是 预设好参数的 的 duration 类:第一个参数使用的long long, 所以表示的是整数。例如std::chrono::seconds的定义为using seconds=duration<long long>;

      • 纳秒(nanoseconds):std::chrono::nanoseconds
      • 微秒(microseconds):std::chrono::microseconds
      • 毫秒(milliseconds):std::chrono::milliseconds
      • 秒(seconds):std::chrono::seconds
      • 分钟(minutes):std::chrono::minutes
      • 小时(hours):std::chrono::hours
    • 示例

      #include <iostream>
      #include <chrono>
      #include <ratio>
      using namespace std;
      
      int main() {
      
      // std::milli 定义为 ratio<1, 1000>
      chrono::duration<int, std::milli> duration1(500); // 创建一个表示500毫秒的duration对象
      chrono::duration<double, std::ratio<1>> duration2(2.5); // 创建一个表示2.5秒的 duration对象
      chrono::duration<float, std::ratio<1>> duration3 = duration1 + duration2; // 创建一个表示3秒的duration对象
      
      
      cout << duration3.count() << endl; // 输出1.1 返回Duration对象表示的时间段值,以它所定义的时间单位返回
      //使用预设好的duration
      chrono::seconds duration4(10); 代表 10 秒
      cout << duration4.count() << endl; // 输出10 
      }

    duration还支持与duration加减和与数字乘除运算符和关系运算符的重载。

  • 使用 duration_cast 可以在不同的duration类型之间转换duration_cast 使用和c++的四种类型转换类似
  • 还可以使用 this_thread::sleep_for配合duration类进行延时, 例如
    this_thread::sleep_for(chrono::seconds(2))

time_point(时间点)

顾名思义就是用于表示具体时间的类型,表示某个具体时刻的时间点
基本用法

#include <iostream>
#include <chrono>

using namespace std::chrono;

int main() {
    // 获取当前时间
    system_clock::time_point now = system_clock::now();
    time_t now_c = system_clock::to_time_t(now);
    std::cout << "当前时间: " << ctime(&now_c);
    // 创建一个用时间戳表示特定时间点的time_point
    system_clock::time_point specific_time = 
            system_clock::time_point(std::chrono::seconds(1718879552)); 
    now_c = system_clock::to_time_t(specific_time);
    std::cout << "特定时间点: " << ctime(&now_c);
}

time_point支持与duration加减运算符和关系运算符的重载。

clock(时钟)

三种不同类型的时钟:

  • system_clock
    是系统级别的时钟,它的时间点是与系统的时钟相关联的,调整系统时间会影响 system_clock
  • steady_clock
    是一个单调递增的时钟,不受系统时间调整的影响。适合用于测量时间间隔和计算算法的执行时间。
  • high_resolution_clock
    high_resolution_clock是一个可用于测量小时间间隔的时钟。它通常使用最高分辨率的时钟源来提供更高的时间精度,是system_clock或者steady_clock中更高分辨率的别名,在大部分平台上是steady_clock的别名

他们都可以用来获取当前时间
示例

#include <iostream>
#include <chrono>

using namespace std::chrono;

int main() {
    // 获取当前时间
    system_clock::time_point now1 = system_clock::now();
    steady_clock::time_point now2 = steady_clock::now();
    system_clock::time_point now3 = high_resolution_clock::now();
}

用steady_clock来 测量代码执行时间

#include <iostream>
#include <chrono>
#include <thread>

using namespace std::chrono;

int main() {
    // 获取当前时间
    steady_clock::time_point now1 = steady_clock::now();
    // 耗时的操作
    std::this_thread::sleep_for(std::chrono::seconds(2)); 
    // 获取当前时间
    steady_clock::time_point now2 = steady_clock::now();
    std::cout << "时间差:" << duration_cast<milliseconds>(now2 - now1).count() << "ms" << std::endl;
} 
c++ c++11
Theme Jasmine by Kent Liao