1*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_TIMERS_H 2*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_TIMERS_H 3*dbb99499SAndroid Build Coastguard Worker 4*dbb99499SAndroid Build Coastguard Worker #include <chrono> 5*dbb99499SAndroid Build Coastguard Worker #include <string> 6*dbb99499SAndroid Build Coastguard Worker 7*dbb99499SAndroid Build Coastguard Worker namespace benchmark { 8*dbb99499SAndroid Build Coastguard Worker 9*dbb99499SAndroid Build Coastguard Worker // Return the CPU usage of the current process 10*dbb99499SAndroid Build Coastguard Worker double ProcessCPUUsage(); 11*dbb99499SAndroid Build Coastguard Worker 12*dbb99499SAndroid Build Coastguard Worker // Return the CPU usage of the children of the current process 13*dbb99499SAndroid Build Coastguard Worker double ChildrenCPUUsage(); 14*dbb99499SAndroid Build Coastguard Worker 15*dbb99499SAndroid Build Coastguard Worker // Return the CPU usage of the current thread 16*dbb99499SAndroid Build Coastguard Worker double ThreadCPUUsage(); 17*dbb99499SAndroid Build Coastguard Worker 18*dbb99499SAndroid Build Coastguard Worker #if defined(BENCHMARK_OS_QURT) 19*dbb99499SAndroid Build Coastguard Worker 20*dbb99499SAndroid Build Coastguard Worker // std::chrono::now() can return 0 on some Hexagon devices; 21*dbb99499SAndroid Build Coastguard Worker // this reads the value of a 56-bit, 19.2MHz hardware counter 22*dbb99499SAndroid Build Coastguard Worker // and converts it to seconds. Unlike std::chrono, this doesn't 23*dbb99499SAndroid Build Coastguard Worker // return an absolute time, but since ChronoClockNow() is only used 24*dbb99499SAndroid Build Coastguard Worker // to compute elapsed time, this shouldn't matter. 25*dbb99499SAndroid Build Coastguard Worker struct QuRTClock { 26*dbb99499SAndroid Build Coastguard Worker typedef uint64_t rep; 27*dbb99499SAndroid Build Coastguard Worker typedef std::ratio<1, 19200000> period; 28*dbb99499SAndroid Build Coastguard Worker typedef std::chrono::duration<rep, period> duration; 29*dbb99499SAndroid Build Coastguard Worker typedef std::chrono::time_point<QuRTClock> time_point; 30*dbb99499SAndroid Build Coastguard Worker static const bool is_steady = false; 31*dbb99499SAndroid Build Coastguard Worker nowQuRTClock32*dbb99499SAndroid Build Coastguard Worker static time_point now() { 33*dbb99499SAndroid Build Coastguard Worker unsigned long long count; 34*dbb99499SAndroid Build Coastguard Worker asm volatile(" %0 = c31:30 " : "=r"(count)); 35*dbb99499SAndroid Build Coastguard Worker return time_point(static_cast<duration>(count)); 36*dbb99499SAndroid Build Coastguard Worker } 37*dbb99499SAndroid Build Coastguard Worker }; 38*dbb99499SAndroid Build Coastguard Worker 39*dbb99499SAndroid Build Coastguard Worker #else 40*dbb99499SAndroid Build Coastguard Worker 41*dbb99499SAndroid Build Coastguard Worker #if defined(HAVE_STEADY_CLOCK) 42*dbb99499SAndroid Build Coastguard Worker template <bool HighResIsSteady = std::chrono::high_resolution_clock::is_steady> 43*dbb99499SAndroid Build Coastguard Worker struct ChooseSteadyClock { 44*dbb99499SAndroid Build Coastguard Worker typedef std::chrono::high_resolution_clock type; 45*dbb99499SAndroid Build Coastguard Worker }; 46*dbb99499SAndroid Build Coastguard Worker 47*dbb99499SAndroid Build Coastguard Worker template <> 48*dbb99499SAndroid Build Coastguard Worker struct ChooseSteadyClock<false> { 49*dbb99499SAndroid Build Coastguard Worker typedef std::chrono::steady_clock type; 50*dbb99499SAndroid Build Coastguard Worker }; 51*dbb99499SAndroid Build Coastguard Worker #endif // HAVE_STEADY_CLOCK 52*dbb99499SAndroid Build Coastguard Worker 53*dbb99499SAndroid Build Coastguard Worker #endif 54*dbb99499SAndroid Build Coastguard Worker 55*dbb99499SAndroid Build Coastguard Worker struct ChooseClockType { 56*dbb99499SAndroid Build Coastguard Worker #if defined(BENCHMARK_OS_QURT) 57*dbb99499SAndroid Build Coastguard Worker typedef QuRTClock type; 58*dbb99499SAndroid Build Coastguard Worker #elif defined(HAVE_STEADY_CLOCK) 59*dbb99499SAndroid Build Coastguard Worker typedef ChooseSteadyClock<>::type type; 60*dbb99499SAndroid Build Coastguard Worker #else 61*dbb99499SAndroid Build Coastguard Worker typedef std::chrono::high_resolution_clock type; 62*dbb99499SAndroid Build Coastguard Worker #endif 63*dbb99499SAndroid Build Coastguard Worker }; 64*dbb99499SAndroid Build Coastguard Worker 65*dbb99499SAndroid Build Coastguard Worker inline double ChronoClockNow() { 66*dbb99499SAndroid Build Coastguard Worker typedef ChooseClockType::type ClockType; 67*dbb99499SAndroid Build Coastguard Worker using FpSeconds = std::chrono::duration<double, std::chrono::seconds::period>; 68*dbb99499SAndroid Build Coastguard Worker return FpSeconds(ClockType::now().time_since_epoch()).count(); 69*dbb99499SAndroid Build Coastguard Worker } 70*dbb99499SAndroid Build Coastguard Worker 71*dbb99499SAndroid Build Coastguard Worker std::string LocalDateTimeString(); 72*dbb99499SAndroid Build Coastguard Worker 73*dbb99499SAndroid Build Coastguard Worker } // end namespace benchmark 74*dbb99499SAndroid Build Coastguard Worker 75*dbb99499SAndroid Build Coastguard Worker #endif // BENCHMARK_TIMERS_H 76