前言
http://t.csdnimg.cn/eprLZ中介绍了关于chrono的基本操作,本文来介绍chrono与其他类的关系。
内容
Duration
duration 表示一段时间间隔
template<class Rep, class Period = std::ratio<1>>
class duration
Rep表示持续时间的数值类型,如int、long long等。这个类型用于存储时间单位的数量上下限;
Period(可选,默认为std::ration<1>):
一个编译时常量时间周期,表示每个Rep单位代表的时间长度。
std::ration是一个模板类,用于表示编译时的分数(分子和分母都是编译时常量)。默认情况下,Period是std::ration<1>,表示每个Rep单位代表1个时间单位(如秒、毫秒等,具体取决于上下文)。
通过组合不同的Rep和Period可以表示不同的长度和精度的时间段,同时,标准库本身也提前预定义了一些类型
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,1000000000>> nanoseconds; // 纳秒
我们也可以自己定义自己所需要长度和精度的时间段;
// 以毫秒为时间单位的整数时间长度
std::chrono::duration<int, std::ratio<1, 1000>>
// 以纳秒为时间单位的长整形时间长度
std::chrono::duration<long long, std::ratio<1, 1000000000>>
time_point
time_point 表示一个时间点;
原型:
template<class _Clock, class _Duration = typename _Clock::duration>
class time_point
_Clock表示时钟类型,例如:std::chrono::system_clock , std::chrono::steady_clock和std::chrono::high_resolution_clock等
_Clock::duration (可选,带默认值)表示一个持续时间类型;
简单使用
std::chrono::time_point<std::chrono::steady_clock, std::chrono::duration<long long, std::nano>> start = std::chrono::steady_clock::now();
auto c = start.time_since_epoch().count();
cout<< c <<endl;
time_point可以通过time_since_epoch成员函数获取从1970年1月1日0点0分0秒到到当前时间点的持续时间
两个time_point进行减法运算
auto start = std::chrono::steady_clock::now();
for (int i = 0; i < 10000; i++)
{
for (auto j = 0; j < 10000; j++)
{
}
}
auto end = std::chrono::steady_clock::now();
auto duration = end - start;
std::cout << "dur::" << duration.count() << endl;
为了方便,我使用auto自动推导类型,但是可以知道 start和end 都是time_point类型,
在进行减法运算后,得到一个duration类型值。也就是说两个时间点相减,得道一个时间段
Clock
high_resolution_clock:高精度时钟
system_clock:从系统获取的时钟
steady_clock:不能被修改的时钟
区别:
system_clock是微秒精度且可调整,steady_clock和high_resolution_clock是纳秒精度不可调整。
auto now = std::chrono::system_clock::now();
auto now2 = std::chrono::steady_clock::now();
auto now3 = std::chrono::high_resolution_clock::now();
cout << "system_clock::" << now.time_since_epoch().count() << endl;
cout << "system_clock::" << std::chrono::system_clock::is_steady << endl;
cout << "system_clock::" << std::chrono::system_clock::period::den << endl;
cout << "system_clock::" << std::chrono::system_clock::period::num << endl;
cout << "steady_clock::" << now2.time_since_epoch().count() << endl;
cout << "steady_clock::" << std::chrono::steady_clock::is_steady << endl;
cout << "steady_clock::" << std::chrono::steady_clock::period::den << endl;
cout << "steady_clock::" << std::chrono::steady_clock::period::num << endl;
cout << "high_resolution_clock::" << now3.time_since_epoch().count() << endl;
cout << "high_resolution_clock::" << std::chrono::high_resolution_clock::is_steady << endl;
cout << "high_resolution_clock::" << std::chrono::high_resolution_clock::period::den << endl;
cout << "high_resolution_clock::" << std::chrono::high_resolution_clock::period::num << endl;