xref: /aosp_15_r20/external/libcxx/utils/google-benchmark/src/timers.h (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker #ifndef BENCHMARK_TIMERS_H
2*58b9f456SAndroid Build Coastguard Worker #define BENCHMARK_TIMERS_H
3*58b9f456SAndroid Build Coastguard Worker 
4*58b9f456SAndroid Build Coastguard Worker #include <chrono>
5*58b9f456SAndroid Build Coastguard Worker #include <string>
6*58b9f456SAndroid Build Coastguard Worker 
7*58b9f456SAndroid Build Coastguard Worker namespace benchmark {
8*58b9f456SAndroid Build Coastguard Worker 
9*58b9f456SAndroid Build Coastguard Worker // Return the CPU usage of the current process
10*58b9f456SAndroid Build Coastguard Worker double ProcessCPUUsage();
11*58b9f456SAndroid Build Coastguard Worker 
12*58b9f456SAndroid Build Coastguard Worker // Return the CPU usage of the children of the current process
13*58b9f456SAndroid Build Coastguard Worker double ChildrenCPUUsage();
14*58b9f456SAndroid Build Coastguard Worker 
15*58b9f456SAndroid Build Coastguard Worker // Return the CPU usage of the current thread
16*58b9f456SAndroid Build Coastguard Worker double ThreadCPUUsage();
17*58b9f456SAndroid Build Coastguard Worker 
18*58b9f456SAndroid Build Coastguard Worker #if defined(HAVE_STEADY_CLOCK)
19*58b9f456SAndroid Build Coastguard Worker template <bool HighResIsSteady = std::chrono::high_resolution_clock::is_steady>
20*58b9f456SAndroid Build Coastguard Worker struct ChooseSteadyClock {
21*58b9f456SAndroid Build Coastguard Worker   typedef std::chrono::high_resolution_clock type;
22*58b9f456SAndroid Build Coastguard Worker };
23*58b9f456SAndroid Build Coastguard Worker 
24*58b9f456SAndroid Build Coastguard Worker template <>
25*58b9f456SAndroid Build Coastguard Worker struct ChooseSteadyClock<false> {
26*58b9f456SAndroid Build Coastguard Worker   typedef std::chrono::steady_clock type;
27*58b9f456SAndroid Build Coastguard Worker };
28*58b9f456SAndroid Build Coastguard Worker #endif
29*58b9f456SAndroid Build Coastguard Worker 
30*58b9f456SAndroid Build Coastguard Worker struct ChooseClockType {
31*58b9f456SAndroid Build Coastguard Worker #if defined(HAVE_STEADY_CLOCK)
32*58b9f456SAndroid Build Coastguard Worker   typedef ChooseSteadyClock<>::type type;
33*58b9f456SAndroid Build Coastguard Worker #else
34*58b9f456SAndroid Build Coastguard Worker   typedef std::chrono::high_resolution_clock type;
35*58b9f456SAndroid Build Coastguard Worker #endif
36*58b9f456SAndroid Build Coastguard Worker };
37*58b9f456SAndroid Build Coastguard Worker 
38*58b9f456SAndroid Build Coastguard Worker inline double ChronoClockNow() {
39*58b9f456SAndroid Build Coastguard Worker   typedef ChooseClockType::type ClockType;
40*58b9f456SAndroid Build Coastguard Worker   using FpSeconds = std::chrono::duration<double, std::chrono::seconds::period>;
41*58b9f456SAndroid Build Coastguard Worker   return FpSeconds(ClockType::now().time_since_epoch()).count();
42*58b9f456SAndroid Build Coastguard Worker }
43*58b9f456SAndroid Build Coastguard Worker 
44*58b9f456SAndroid Build Coastguard Worker std::string LocalDateTimeString();
45*58b9f456SAndroid Build Coastguard Worker 
46*58b9f456SAndroid Build Coastguard Worker }  // end namespace benchmark
47*58b9f456SAndroid Build Coastguard Worker 
48*58b9f456SAndroid Build Coastguard Worker #endif  // BENCHMARK_TIMERS_H
49