xref: /aosp_15_r20/external/google-benchmark/src/timers.h (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
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