73 lines
2.4 KiB
C++
73 lines
2.4 KiB
C++
#include <iostream>
|
|
#include <chrono>
|
|
#include <ratio>
|
|
|
|
// In NDK GCC 4.6 and below, "steady_clock" is called "monotonic_clock",
|
|
// and "is_steady" is called "is_monotonic". One may be tempted to use
|
|
// __GLIBCXX__ to detect it by doing
|
|
//
|
|
// # if __GLIBCXX__ < 20120920 /* 20120920 is the date of gcc-4.7 in NDK */
|
|
//
|
|
// But __GLIBCXX__ get date from gcc/DATESTAMP. Although it never changes
|
|
// (so far) once deposit in toolchain/gcc.git, it gets daily bump in upstream.
|
|
// Thus, this approach may not work in other gcc release.
|
|
//
|
|
// We can detect it by
|
|
//
|
|
// #if !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
|
|
//
|
|
// But unfortunately clang uses gcc libstdc++ w/o defining __GNUC__ at all.
|
|
// Since clang now sides with gcc-4.7, we need the following intead
|
|
//
|
|
// #if !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) || defined(__clang__))
|
|
//
|
|
// This approach won't be valid if clang sides with gcc4.6 (in standalone mode, for
|
|
// example).
|
|
//
|
|
// ToDo: better approach
|
|
|
|
#if !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) || defined(__clang__))
|
|
namespace std {
|
|
namespace chrono {
|
|
typedef monotonic_clock steady_clock;
|
|
}
|
|
}
|
|
#define is_steady is_monotonic
|
|
#endif
|
|
|
|
template <typename C>
|
|
void printClockData (bool &is_high_res, bool &is_steady)
|
|
{
|
|
using namespace std;
|
|
|
|
cout << "- precision: ";
|
|
// if time unit is less or equal one millisecond
|
|
typedef typename C::period P;// type of time unit
|
|
if (ratio_less_equal<P,milli>::value) {
|
|
// convert to and print as milliseconds
|
|
typedef typename ratio_multiply<P,kilo>::type TT;
|
|
cout << fixed << double(TT::num)/TT::den
|
|
<< " milliseconds" << endl;
|
|
is_high_res = true;
|
|
}
|
|
else {
|
|
// print as seconds
|
|
cout << fixed << double(P::num)/P::den << " seconds" << endl;
|
|
is_high_res = false;
|
|
}
|
|
cout << "- is_steady: " << boolalpha << C::is_steady << endl;
|
|
is_steady = C::is_steady;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
bool is_high_res1, is_high_res2, is_high_res3, is_steady;
|
|
std::cout << "system_clock: " << std::endl;
|
|
printClockData<std::chrono::system_clock>(is_high_res1, is_steady);
|
|
std::cout << "\nhigh_resolution_clock: " << std::endl;
|
|
printClockData<std::chrono::high_resolution_clock>(is_high_res2, is_steady);
|
|
std::cout << "\nsteady_clock: " << std::endl;
|
|
printClockData<std::chrono::steady_clock>(is_high_res3, is_steady);
|
|
|
|
return (is_high_res1 && is_high_res2 && is_high_res3 && is_steady)? 0 : 1;
|
|
}
|