clock
: system_clock
日期时间; steady_clock
启动时间, 硬件震动clock
;duration
使用精度类型(min,sec,ms,ns等 加 数量)
; rep
记录对应精度数量的类型(默认longlong, 也可以自定义其他类型)
; period
: 精度, 即当前精度等于1s*ratio
, (ms = 1 / 1000s)
; time_point
: 用system_clock
作为表达方式的时刻;is_steady
是否高精度;now, to_time_t, from_time_t
, 即如何用系统的时间机制生成STL
对象;duration
: 一段时间, 适用于日期计算;即精度 + 精度数量; ms * 1000
即1000ms
;
time_point
: 时刻点 = clock + duration
, 适用于高精度程序执行耗时计算;即起始时刻可以是1970.1.1
为起始用于日期计算; 也可以是电脑开机时间为起始用于时间计算;
epoch
duration
: ratio * count
, 转换规则count * ratio_new / ratio_old
;timepoint
: epoch + duration
clock
: 从系统获取对应类型值, 用于生成匹配类型;clock
system_clock
: 可变化计算量定义了四种类型; 一个静态成员, 三个对象生成器;
class _LIBCPP_TYPE_VIS system_clock
{
public:
typedef microseconds duration;
typedef duration::rep rep;
typedef duration::period period;
typedef chrono::time_point<system_clock> time_point;
static constexpr const bool is_steady = false;
static time_point now() _NOEXCEPT;
static time_t to_time_t (const time_point& __t) _NOEXCEPT;
static time_point from_time_t(time_t __t) _NOEXCEPT;
};
steady_clock
: 启动时间, 常量;class _LIBCPP_TYPE_VIS steady_clock
{
public:
typedef nanoseconds duration;
typedef duration::rep rep;
typedef duration::period period;
typedef chrono::time_point<steady_clock, duration> time_point;
static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true;
static time_point now() _NOEXCEPT;
};
high_resolution_clock
: 即二选一, 优先steady_clock
;#ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK
class _LIBCPP_TYPE_VIS steady_clock
{
public:
typedef nanoseconds duration;
typedef duration::rep rep;
typedef duration::period period;
typedef chrono::time_point<steady_clock, duration> time_point;
static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true;
static time_point now() _NOEXCEPT;
};
typedef steady_clock high_resolution_clock;
#else
typedef system_clock high_resolution_clock;
#endif
clock
定义了四种成员类型;system_clock, steady_clock
主要差异在使用精度(microseconds, nanoseconds)
不同;duration = rep + period
, time_point = clock + duration
, time_point
可以是时间日期, 也可以是启动时间点;duration::count()
template <class _ToDuration, class _Rep, class _Period>
inline _LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR
typename enable_if
<
__is_duration<_ToDuration>::value,
_ToDuration
>::type
duration_cast(const duration<_Rep, _Period>& __fd)
{
return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd);
}
template <class _ToDuration, class _Clock, class _Duration>
inline constexpr time_point<_Clock, _ToDuration>
time_point_cast(const time_point<_Clock, _Duration>& __t)
{
return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch()));
}
c++17
#if _LIBCPP_STD_VER > 14
template <class _ToDuration, class _Clock, class _Duration>
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
typename enable_if
<
__is_duration<_ToDuration>::value,
time_point<_Clock, _ToDuration>
>::type
floor(const time_point<_Clock, _Duration>& __t)
{
return time_point<_Clock, _ToDuration>{floor<_ToDuration>(__t.time_since_epoch())};
}
template <class _ToDuration, class _Clock, class _Duration>
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
typename enable_if
<
__is_duration<_ToDuration>::value,
time_point<_Clock, _ToDuration>
>::type
ceil(const time_point<_Clock, _Duration>& __t)
{
return time_point<_Clock, _ToDuration>{ceil<_ToDuration>(__t.time_since_epoch())};
}
template <class _ToDuration, class _Clock, class _Duration>
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
typename enable_if
<
__is_duration<_ToDuration>::value,
time_point<_Clock, _ToDuration>
>::type
round(const time_point<_Clock, _Duration>& __t)
{
return time_point<_Clock, _ToDuration>{round<_ToDuration>(__t.time_since_epoch())};
}
template <class _Rep, class _Period>
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
typename enable_if
<
numeric_limits<_Rep>::is_signed,
duration<_Rep, _Period>
>::type
abs(duration<_Rep, _Period> __d)
{
return __d >= __d.zero() ? +__d : -__d;
}
#endif
system_clock
; 耗时计算: steady_clock
duration
: 支持各种精度记录时间;// 算数类型 + second 的 n 倍精度;
typedef duration<long long, nano> nanoseconds;
typedef duration<long long, micro> microseconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long > seconds;
typedef duration< long, ratio< 60> > minutes;
typedef duration< long, ratio<3600> > hours;
template <intmax_t _Num, intmax_t _Den = 1>
class ratio;
// 分数精度, 常用单位s
typedef ratio<1LL, 1000000000000000000LL> atto;
typedef ratio<1LL, 1000000000000000LL> femto;
typedef ratio<1LL, 1000000000000LL> pico;
typedef ratio<1LL, 1000000000LL> nano;
typedef ratio<1LL, 1000000LL> micro;
typedef ratio<1LL, 1000LL> milli;
typedef ratio<1LL, 100LL> centi;
typedef ratio<1LL, 10LL> deci;
typedef ratio< 10LL, 1LL> deca;
typedef ratio< 100LL, 1LL> hecto;
typedef ratio< 1000LL, 1LL> kilo;
typedef ratio< 1000000LL, 1LL> mega;
typedef ratio< 1000000000LL, 1LL> giga;
typedef ratio< 1000000000000LL, 1LL> tera;
typedef ratio< 1000000000000000LL, 1LL> peta;
typedef ratio<1000000000000000000LL, 1LL> exa;
count()
获取对应单位的时刻clock
之间转换:, duration
之间转换:duration_cast
; time_point
之间转换:time_point_cast
;https://en.cppreference.com/w/cpp/chrono
clock
之间计算返回结果duration
, 之间类型转换并获取结果;#include
#include
#include
#include
int main() {
//std::cout << std::chrono::system_clock::now().time_since_epoch().count() << std::endl;
auto start = std::chrono::system_clock::now();
sleep(1);
auto end = std::chrono::system_clock::now();
auto dif = end - start;
std::cout << std::chrono::round<std::chrono::seconds>(dif).count() << std::endl;
}
建议用high_resolution_clock
计算两个点程序执行时间差duration
;