天天看点

std::chrono笔记

文章目录

    • 1. radio
      • 原型
      • 作用
      • 示例
    • 2. duration
      • 原型:
      • 作用
      • 示例
    • 3. time_point
      • 原型
      • 作用
      • 示例
    • 4. clocks
      • system_clock
        • 示例
      • steady_clock
        • 示例
      • high_resolution_clock

先说感觉,这个库真恶心,刚接触感觉跟shi一样,特别是那个命名空间,太长了。

就像这样:

std::chrono笔记

后来感觉设计还挺巧妙,才觉得看起来顺眼一些。

1. radio

原型

作用

时间换算的比率 / 表示时间精度。

ratio

是一个比率的模板(分子/分母)。第一个模板参数是分子,第二个模板参数是分母,也可以只提供第一个,这样分母默认是0。主要用来表示精度、

可以把它当成一个分数,仅有

ratio

我们是做不了什么的。

示例

std::ratio<60, 1> minute;
	std::ratio<1, 1> second;
	std::ratio<1, 1000> millisecond;
           

当然,头文件有预定义的例子,可以参考:

typedef ratio<1,       1000000000000000000> atto;
  typedef ratio<1,          1000000000000000> femto;
  typedef ratio<1,             1000000000000> pico;
  typedef ratio<1,                1000000000> nano;
  typedef ratio<1,                   1000000> micro;
  typedef ratio<1,                      1000> milli;
  typedef ratio<1,                       100> centi;
  typedef ratio<1,                        10> deci;
  typedef ratio<                       10, 1> deca;
  typedef ratio<                      100, 1> hecto;
  typedef ratio<                     1000, 1> kilo;
  typedef ratio<                  1000000, 1> mega;
  typedef ratio<               1000000000, 1> giga;
  typedef ratio<            1000000000000, 1> tera;
  typedef ratio<         1000000000000000, 1> peta;
  typedef ratio<      1000000000000000000, 1> exa;
           

2. duration

原型:

构造函数(想快点理解话,主要看第4个):

(1)duration() = default;    //默认构造
(2)duration (const duration& dtn);        //(2)(3)拷贝构造
(3)template<class Rep2, class Period2>
   constexpr duration (const duration<Rep2,Period2>& dtn);
(4)template<class Rep2>      //传递一个某类型(int等)的数值,构造一个时间段   
   constexpr explicit duration (const Rep2& n);
           

作用

表示一段时间。

第一个模板参数

Rep

可以是int、float、double,第二个模板参数

Period

用来表示精度。

Rep

表示

Period

的数目。

duration

模板中的方法

count

用来返回

Period

的数量,返回值是

Rep

类型。

不同类型的

duration

之间的转换用

duration_cast<>

,原型如下:

template <class ToDuration, class Rep, class Period>
constexpr ToDuration
duration_cast (const duration<Rep,Period>& dtn);
           

示例

#include <iostream>
#include <chrono>
#include <ctime>

using namespace std;
using namespace chrono;

int main (void)
{
	using seconds_type = duration<int, ratio<1, 1>>;
	using minutes_type = duration<int, ratio<60, 1>>;
	using hours_type = duration<int, ratio<3600, 1>>;
	using milliseconds_type = duration<int, ratio<1, 1000>>;
	
	seconds_type oneday_seconds (3600 * 24);
	hours_type oneday_hours (24);
	minutes_type oneday_minutes (60 * 24);
	milliseconds_type oneday_milliseconds (3600 * 24 * 1000);
	cout << "一天的秒数: " << oneday_seconds.count() << endl;
	cout << "一天的小时数: " << oneday_hours.count() << endl;
	cout << "一天的分钟数: " << oneday_minutes.count() << endl;
	cout << "一天的毫秒数: " << oneday_milliseconds.count() << endl;
	
	hours_type oneday_hours_from_milliseconds = duration_cast<hours_type> (oneday_milliseconds);
	hours_type oneday_hours_from_seconds = duration_cast<hours_type> (oneday_seconds);
	hours_type oneday_hours_from_miniues = duration_cast<hours_type> (oneday_minutes);
	cout << "转换后>>" << endl;
	cout << "一天的小时数:" << oneday_hours_from_milliseconds.count() << endl;
	cout << "一天的小时数:" << oneday_hours_from_seconds.count() << endl;
	cout << "一天的小时数:" << oneday_hours_from_miniues.count() << endl;
	
	cout << "一天的秒数:" << duration_cast<seconds_type> (oneday_milliseconds).count() << endl;
	cout << "一天的秒数:" << duration_cast<seconds_type> (oneday_minutes).count() << endl;
	cout << "一天的秒数:" << duration_cast<seconds_type> (oneday_hours).count() << endl;
	
	cout << "一天的毫秒数:" << duration_cast<milliseconds_type> (oneday_seconds).count() << endl;
	cout << "一天的毫秒数:" << duration_cast<milliseconds_type> (oneday_minutes).count() << endl;
	cout << "一天的毫秒数:" << duration_cast<milliseconds_type> (oneday_hours).count() << endl;
}
           

打印结果:

一天的秒数: 86400
一天的小时数: 24
一天的分钟数: 1440
一天的毫秒数: 86400000
转换后>>
一天的小时数:24
一天的小时数:24
一天的小时数:24
一天的秒数:86400
一天的秒数:86400
一天的秒数:86400
一天的毫秒数:86400000
一天的毫秒数:86400000
一天的毫秒数:86400000
           

也可以用头文件中预定义的:

/// nanoseconds
    using nanoseconds	= duration<_GLIBCXX_CHRONO_INT64_T, nano>;
    /// microseconds
    using microseconds	= duration<_GLIBCXX_CHRONO_INT64_T, micro>;
    /// milliseconds
    using milliseconds	= duration<_GLIBCXX_CHRONO_INT64_T, milli>;
    /// seconds
    using seconds	= duration<_GLIBCXX_CHRONO_INT64_T>;
    /// minutes
    using minutes	= duration<_GLIBCXX_CHRONO_INT64_T, ratio< 60>>;
    /// hours
    using hours		= duration<_GLIBCXX_CHRONO_INT64_T, ratio<3600>>;
   ...
   ...
           

3. time_point

原型

template <class Clock, class Duration = typename Clock::duration>
  class time_point;
           

另外看一下

system_clock

中内容:

struct system_clock
    {
      typedef chrono::nanoseconds				duration;
      typedef duration::rep					rep;
      typedef duration::period					period;
      typedef chrono::time_point<system_clock, duration> 	time_point;

		...
           

标准库有三种钟:

system_clock

steady_clock

high_resolution_clock

可以看出

system_clock::time_point

默认用的钟是

system_clock

duration

是纳秒级别的

nanoseconds

同时,为了转换不同的

time_point

,还提供了

time_point_cast

template <class ToDuration, class Clock, class Duration>
time_point<Clock,ToDuration>
time_point_cast (const time_point<Clock, Duration>& tp);

           

作用

表示时间点,一个time point必须有一个clock计时

示例

  1. 打印
system_clock::time_point tp_epoch;
	
	time_point<system_clock, seconds> tp_seconds (seconds (1));
	time_point<
	//默认的time_point是纳米级:
	system_clock::time_point tp (tp_seconds);
	
	printf ("system_clock中,一秒对应%d个时钟周期\n",
			 tp.time_since_epoch().count() );
	
	system_clock::time_point
	time_t time = system_clock::to_time_t (tp);
	printf ("tp的打印结果:%s", ctime (&time));
           

打印结果:

system_clock中,一秒对应1000000000个时钟周期
tp的打印结果:Thu Jan  1 08:00:01 1970
           
  1. 转换
using days_type = duration<int, ratio<3600 * 24>>;
	time_point<system_clock, days_type> today
	    = time_point_cast<days_type> (system_clock::now());
	printf ("从epoch到现在的天数: %d", today.time_since_epoch().count());
           

打印结果:

到这里应该更能体会到,那个

ratio<3600 * 24>

,表示一个单位,

int

其实是单位的数量,整体看起来就是一段时间,只不过这段时间的精度是按天来算的,且数目是

int

类型。

4. clocks

system_clock

system_clock

表示当前的系统时钟,系统中运行的所有进程使用

now()

得到的时间是一致的。

每一个clock类中都有确定的

time_point

,

duration

,

Rep

,

Period

类型。

操作有:

  • now()

    • 当前时间

      time_point

  • to_time_t()

    • time_point

      转换成

      time_t

  • from_time_t()

    • time_t

      转换成

      time_poin

示例

计算时间日期

#include <iostream>
#include <chrono>
#include <ctime>
#include <fmt/format.h>

using namespace std;
using namespace chrono;

int main (void)
{
	using days_type = duration<int, ratio<3600 * 24>>;
	days_type one_day (1);
	
	system_clock::time_point today = system_clock::now();
	system_clock::time_point tomorrow = today + one_day;
	
	time_t time = system_clock::to_time_t (today);
	printf ("今天是:%s", ctime (&time));
	time = system_clock::to_time_t (tomorrow);
	printf ("明天是:%s", ctime (&time));
}
           

steady_clock

steady_clock

为了表示稳定的时间间隔,后一次调用

now()

得到的时间总是比前一次的值大(这句话的意思其实是,如果中途修改了系统时间,也不影响

now()

的结果),每次

tick

都保证过了稳定的时间间隔。

操作有:

  • now()

    • 获取当前时钟

示例

典型的应用是给算法计时。

#include <iostream>
#include <chrono>
#include <ctime>
#include <fmt/format.h>

using namespace std;
using namespace chrono;

int main (void)
{
	steady_clock::time_point t1 = steady_clock::now();
	cout << "打印1000个 *" << endl;
	
	for (int i = 0; i < 1000; ++i)
		cout << "*";
	cout << endl;
	steady_clock::time_point t2 = steady_clock::now();
	
	duration<double> time = duration_cast<duration<double>> (t2 - t1);
	cout << "花费的秒数:" << time.count() << endl;
}
           
*************************************...
花费的秒数:9.3816e-05
           

high_resolution_clock

最后一个时钟,

high_resolution_clock

顾名思义,这是系统可用的最高精度的时钟。实际上

high_resolution_clock

只不过是

system_clock

或者

steady_clock

typedef

操作有:

  • now()

    • 获取当前时钟。

参考博客:

C++11 std::chrono库详解

c++11 chrono全面解析(最高可达纳秒级别的精度)

继续阅读