
<chrono> Clock Survey
This survey shows you how to discover the properties of the three
<chrono> clocks:
std::chrono::system_clockstd::chrono::steady_clockstd::chrono::high_resolution_clockHere is code to discover each clock's properties:
#include <climits>
#include <chrono>
#include <cstddef>
#include <cstdlib>
#ifndef _MSC_VER
# include <cxxabi.h>
#endif
#include <iostream>
#include <memory>
#include <string>
#include <typeinfo>
#include <type_traits>
template <typename T>
std::string
type_name()
{
typedef typename std::remove_reference<T>::type TR;
std::unique_ptr<char, void(*)(void*)> own
(
#ifndef _MSC_VER
abi::__cxa_demangle(typeid(TR).name(), nullptr,
nullptr, nullptr),
#else
nullptr,
#endif
std::free
);
std::string r = own != nullptr ? own.get() : typeid(TR).name();
if (std::is_const<TR>::value)
r += " const";
if (std::is_volatile<TR>::value)
r += " volatile";
if (std::is_lvalue_reference<T>::value)
r += "&";
else if (std::is_rvalue_reference<T>::value)
r += "&&";
return r;
}
template <class Clock>
void
stats(std::string const& msg)
{
std::cout << msg << '\n';
const std::size_t bits = CHAR_BIT * sizeof(typename Clock::rep);
std::cout << " rep is " << type_name<typename Clock::rep>() << " : "
<< bits << " bits\n";
std::cout << " period is " << Clock::period::num << '/'
<< Clock::period::den << '\n';
std::cout << " is_steady is " << Clock::is_steady << '\n';
}
int
main()
{
using namespace std::chrono;
stats<system_clock>("system_clock");
stats<steady_clock>("steady_clock");
stats<high_resolution_clock>("high_resolution_clock");
if (std::is_same<high_resolution_clock, system_clock>::value)
std::cout << "high_resolution_clock is the same type as system_clock\n";
if (std::is_same<high_resolution_clock, steady_clock>::value)
std::cout << "high_resolution_clock is the same type as steady_clock\n";
if (std::is_same<system_clock, steady_clock>::value)
std::cout << "system_clock is the same type as steady_clock\n";
}
There are three implementations of <chrono> that I am aware of:
The results are (I've taken minor liberities with the formatting):
libc++:
system_clock
rep is long long : 64 bits
period is 1/1,000,000
is_steady is 0
steady_clock
rep is long long : 64 bits
period is 1/1,000,000,000
is_steady is 1
high_resolution_clock
rep is long long : 64 bits
period is 1/1,000,000,000
is_steady is 1
high_resolution_clock is the same type as steady_clock
libstdc++:
system_clock
rep is long : 64 bits
period is 1/1,000,000,000
is_steady is 0
steady_clock
rep is long : 64 bits
period is 1/1,000,000,000
is_steady is 1
high_resolution_clock
rep is long : 64 bits
period is 1/1,000,000,000
is_steady is 0
high_resolution_clock is the same type as system_clock
VS:
system_clock
rep is __int64 : 64 bits
period is 1/10,000,000
is_steady is 0
steady_clock
rep is __int64 : 64 bits
period is 1/1,000,000,000
is_steady is 1
high_resolution_clock
rep is __int64 : 64 bits
period is 1/1,000,000,000
is_steady is 1
high_resolution_clock is the same type as steady_clock
There exist online compilers for each of these implementations, and so you can check these results for yourself, on each of these three platforms.
I have further found that each implementation of std::chrono::system_clock
is measuring Unix Time. That is,
they count non-leap-seconds since 1970-01-01 00:00:00 UTC, except with a precision
as noted by the survey above. You can confirm this yourself with the software
at this link.