chrono 时间库

236 阅读5分钟

时间库

chrono 是一个头文件的名称,也是一个子命名空间的名称: 该头文件中的所有元素(common_type 特殊化除外)都不是直接定义在 std 名称空间下的(就像标准库中的大部分内容一样),而是定义在 std::chrono 名称空间下的。

该头文件中的元素与时间有关。 这主要是通过三个概念来实现的:

  • 持续时间-Durations

    它们测量时间跨度,如:一分钟、两小时或十毫秒。 在本库中,它们用持续时间类模板的对象来表示,耦合了计数表示法和周期精度(例如,十毫秒的计数表示法是十,周期精度是毫秒)。

  • 时间点-Time points

    对特定时间点的引用,如一个人的生日、今天的黎明或下一班火车经过的时间。 在本库中,time_point 类模板的对象通过使用相对于纪元的持续时间(这是使用相同时钟的所有 time_point 对象共有的固定时间点)来表达这一点。

  • 时钟-Clocks

    将时间点与实际物理时间相关联的框架。 该库至少提供了三种时钟,可将当前时间表示为一个时间点:system_clock(系统时钟)、steady_clock(稳定时钟)和 high_resolution_clock(高分辨率时钟)。

steady_clock(稳定时钟)

steady_clock 提供对当前时间点的访问。 专门用于计算时间间隔。

成员常数: is_steady:只能为true

成员类型

成员类型默认值描述
rep有符号运算类型(或模拟该类型的类)用于存储周期(period)计数。
period比例类型(分子/分母)表示一个周期(period)的时间长度,以秒为单位(可以表达小于1秒)
durationduration<rep,period>时钟的持续时间类型。
time_pointtime_point<system_clock>时钟的时间点类型。

比如:rep*period等于经过了多少秒,也可以转换成微妙

成员函数

成员函数描述
now获取当前时间
/ steady_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>

int main ()
{
  using namespace std::chrono;

  steady_clock::time_point t1 = steady_clock::now();

  std::cout << "printing out 1000 stars...\n";
  for (int i=0; i<1000; ++i) std::cout << "*";
  std::cout << std::endl;

  steady_clock::time_point t2 = steady_clock::now();

  duration<double> time_span = duration_cast<duration<double>>(t2 - t1);

  std::cout << "It took me " << time_span.count() << " seconds.";
  std::cout << std::endl;

  return 0;
}

system_clock(系统时钟)

提供对当前时点的访问。具体来说,system_clock 是一个全系统的实时时钟。

成员常数: is_steady: 一个 bool 值,指定时钟是否总是前进,以及是否相对于物理时间处于稳定状态。 如果为 "true",这意味着系统时钟可能不会被调整。

成员类型

成员类型默认值描述
rep有符号运算类型(或模拟该类型的类)用于存储周期(period)计数。
period比例类型表示一个周期(period)的时间长度,以秒为单位
durationduration<rep,period>时钟的持续时间类型。
time_pointtime_point<system_clock>时钟的时间点类型。

成员函数

成员函数描述
now获取当前时间
to_time_t转换为 time_t
from_time_t从 time_t 转换
// system_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>

int main ()
{
  using std::chrono::system_clock;

  std::chrono::duration<int,std::ratio<60*60*24> > one_day (1);

  system_clock::time_point today = system_clock::now();
  system_clock::time_point tomorrow = today + one_day;

  std::time_t tt;

  tt = system_clock::to_time_t ( today );
  std::cout << "today is: " << ctime(&tt);

  tt = system_clock::to_time_t ( tomorrow );
  std::cout << "tomorrow will be: " << ctime(&tt);

  return 0;
}

Possible output:

today is: Wed May 30 12:25:03 2012 
tomorrow will be: Thu May 31 12:25:03 2012 

high_resolution_clock(高分辨率时钟)

高分辨率时钟(high_resolution_clock)是刻度周期最短的时钟。 它可能是 system_clock 或 steady_clock 的同义词, 不稳定。

持续时间-duration

template <class Rep, class Period = ratio<1> > class duration;

Rep:用于存储周期(period)的计数(count),类似于滴答数。
Period:以秒为单位表示周期的比率类型(分子/分母,可以表达小于1秒)。

持续时间对象通过计数和周期来表达时间跨度。

在内部,该对象将计数存储为成员类型 rep(第一个模板参数 Rep 的别名)的对象,可以通过调用成员函数 count 来获取。

count用周期(Period)表示。 周期的长度(在编译时)由第二个模板参数(Period)整合到类型中,这是一个比率类型,表示每个周期内经过的秒数(分子/分母的方式,可以表示比1秒更小的单位)。

模板初始化 该命名空间还定义了以下有关持续时间实例的方便类型定义:

type描述Period
hours一小时的持续时间ratio<3600,1>
minutes一分钟的持续时间ratio<60,1>
seconds一秒钟的持续时间ratio<1,1>
milliseconds一毫秒的持续时间ratio<1,1000>
microseconds一微妙的持续时间ratio<1,1000000>
nanoseconds一纳秒的持续时间ratio<1,1000000000>

成员类型

成员类型默认值描述
rep有符号运算类型(或模拟该类型的类)用于存储周期(period)计数。
period比例类型(分子/分母)表示一个周期(period)的时间长度,以秒为单位(可以表达小于1秒)

构造

(1) duration() = default;
默认构造函数 :使用默认初始化的计数值构造一个对象。
(2)duration (const duration& dtn);
将对象初始化为 dtn 的持续时间。
(3)template<class Rep2, class Period2> constexpr duration (const duration<Rep2,Period2>& dtn);
将对象初始化为 dtn 的持续时间。
(4)template<class Rep2>constexpr explicit duration (const Rep2& n);
将对象初始化为计数为 n 的持续时间。

例子:

// duration constructor
#include <iostream>
#include <ratio>
#include <chrono>

int main ()
{

  std::chrono::hours h_oneday (24);                  // 24h
  std::chrono::seconds s_oneday (60*60*24);          // 86400s
  std::chrono::milliseconds ms_oneday (s_oneday);    // 86400000ms

  std::chrono::seconds s_onehour (60*60);            // 3600s
//std::chrono::hours h_onehour (s_onehour);          // NOT VALID (type truncates), use:
  std::chrono::hours h_onehour (std::chrono::duration_cast<std::chrono::hours>(s_onehour));
  std::chrono::milliseconds ms_onehour (s_onehour);  // 3600000ms (ok, no type truncation)

  std::cout << ms_onehour.count() << "ms in 1h" << std::endl;

  return 0;
}

成员函数

constexpr rep count() const;

返回值是内部表示值的当前值,对象的表示值,表示周期数。用类的周期间隔表示,不一定是秒。

// duration::count
#include <iostream>     // std::cout
#include <chrono>       // std::chrono::seconds, std::chrono::milliseconds
                        // std::chrono::duration_cast

int main ()
{
  using namespace std::chrono;
  // std::chrono::milliseconds is an instatiation of std::chrono::duration:
  milliseconds foo (1000); // 1 second
  foo*=60;

  std::cout << "duration (in periods): ";
  std::cout << foo.count() << " milliseconds.\n";

  std::cout << "duration (in seconds): ";
  std::cout << foo.count() * milliseconds::period::num / milliseconds::period::den;
  std::cout << " seconds.\n";

  return 0;
}