duration表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟或者几个小时的时间间隔。
duration的原型如下:
template<class Rep, class Period = std::ratio<1, 1>>
class duration;
第一个模板参数Rep是一个数值类型,表示时钟数的类型;
第二个模板参数是一个默认模板参数std::ratio,表示时钟周期,它的原型如下:
template<std::intmax_t Num, std::intmax_t Denom = 1>
class ratio;
它表示每个时钟周期的秒数,其中第一个模板参数Num代表分子,Denom代表分母,分母默认为1,因此,ratio代表的是一个分子除以分母的分数值,比如ratio<2>代表一个时钟周期是两秒,ratio<60>代表一分钟, ratio<60*60>代表一个小时,?ratio<60*60*24>代表一天。而ratio <1, 1000>代表的则是1/1000秒,即一毫秒,ratio<1, 1000000>代表一微秒,ratio<1, 1000000000>代表一纳秒。为了方便使用,标准库定义了一些常用的时间间隔,如时、分、秒、毫秒、微秒和纳秒,在chrono命名空间下,它们的定义如下:
typedef duration <Rep, ratio<3600,1>> hours;
typedef duration <Rep, ratio<60,1>> minutes;
typedef duration <Rep, ratio<1,1>> seconds;
typedef duration <Rep, ratio<1,1000>> milliseconds;
typedef duration <Rep, ratio<1,1000000>> microseconds;
typedef duration <Rep, ratio<1,100oo0oo00>> nanoseconds;
clocks表示当前的系统时钟,内部有time_point、duration、Rep、Period等信息,主要用来获取当前时间,以及实现time_t和 time_point 的相互转换。clocks包含如下3种时钟: system_clock:代表真实世界的挂钟时间,具体时间值依赖于系统。system_clock 保证提供的时间值是一个可读时间。
steady_clock:不能被“调整”的时钟,并不一定代表真实世界的挂钟时间。保证先后调用now()得到的时间值是不会递减的。
high_resolution_clock:高精度时钟,实际上是system_clock或者steady_clock 的别名。可以通过now()来获取当前时间点,代码如下:
std::chrono::system_clock::time_point t1 = std::chrono::system_clock::now();
cout <<"Hello world\n" ;
std::chrono::system_clock::time_point t2 = std::chrono::system_clock::now();
cout<<(t2-t1).count()<<"tick count"<<endl;
system_clock的to_time_t方法可以将一个time_point转换为ctime:
std::time_t now_c = std::chrono::system_clock::to_time_t(time_point) ;
from_time_t将ctime转为time_point。
system_clock和std:put_time配合起来使用可以格式化日期的输出。
auto t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
cout<< std::put_time(std::localtime(&t), "%Y-%m-%d %X")<<endl;
cout<< std::put_time(std::localtime(&t), "%Y-%m-%d %H.%M.%S" )<<endl;
可以利用high_resolution_clock来实现一个类似于boost.timer的计时器,这样的timer在测试性能时经常用到。timer经常用于测试函数耗时,它的基本用法如下:
void fun ()
{
cout<<"hello word"<<endl;
}
int main ()
{
Timer t;
//开始计时
fun();
cout<<t.elapsed()<<endl; //打印 fun函数耗时多少毫秒
cout<<t.elapsed_micro()<<endl;//打印微秒
cout<<t.elapsed_nano()<<endl ;//打印纳秒
cout<<t.elapsed_seconds()<<endl;//打印秒
cout<<t.elapsed_minutes()<<endl;//打印分钟
cout<<t.elapsed_hours()<<endl;//打印小时
}