| #ifndef BENCHMARK_TIMERS_H | |
| #define BENCHMARK_TIMERS_H | |
| #include <chrono> | |
| #include <string> | |
| namespace benchmark { | |
| // Return the CPU usage of the current process | |
| double ProcessCPUUsage(); | |
| // Return the CPU usage of the children of the current process | |
| double ChildrenCPUUsage(); | |
| // Return the CPU usage of the current thread | |
| double ThreadCPUUsage(); | |
| #if defined(BENCHMARK_OS_QURT) | |
| // std::chrono::now() can return 0 on some Hexagon devices; | |
| // this reads the value of a 56-bit, 19.2MHz hardware counter | |
| // and converts it to seconds. Unlike std::chrono, this doesn't | |
| // return an absolute time, but since ChronoClockNow() is only used | |
| // to compute elapsed time, this shouldn't matter. | |
| struct QuRTClock { | |
| typedef uint64_t rep; | |
| typedef std::ratio<1, 19200000> period; | |
| typedef std::chrono::duration<rep, period> duration; | |
| typedef std::chrono::time_point<QuRTClock> time_point; | |
| static const bool is_steady = false; | |
| static time_point now() { | |
| unsigned long long count; | |
| asm volatile(" %0 = c31:30 " : "=r"(count)); | |
| return time_point(static_cast<duration>(count)); | |
| } | |
| }; | |
| #else | |
| #if defined(HAVE_STEADY_CLOCK) | |
| template <bool HighResIsSteady = std::chrono::high_resolution_clock::is_steady> | |
| struct ChooseSteadyClock { | |
| typedef std::chrono::high_resolution_clock type; | |
| }; | |
| template <> | |
| struct ChooseSteadyClock<false> { | |
| typedef std::chrono::steady_clock type; | |
| }; | |
| #endif // HAVE_STEADY_CLOCK | |
| #endif | |
| struct ChooseClockType { | |
| #if defined(BENCHMARK_OS_QURT) | |
| typedef QuRTClock type; | |
| #elif defined(HAVE_STEADY_CLOCK) | |
| typedef ChooseSteadyClock<>::type type; | |
| #else | |
| typedef std::chrono::high_resolution_clock type; | |
| #endif | |
| }; | |
| inline double ChronoClockNow() { | |
| typedef ChooseClockType::type ClockType; | |
| using FpSeconds = std::chrono::duration<double, std::chrono::seconds::period>; | |
| return FpSeconds(ClockType::now().time_since_epoch()).count(); | |
| } | |
| std::string LocalDateTimeString(); | |
| } // end namespace benchmark | |
| #endif // BENCHMARK_TIMERS_H |