xref: /aosp_15_r20/external/libcxx/utils/google-benchmark/src/thread_timer.h (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker #ifndef BENCHMARK_THREAD_TIMER_H
2*58b9f456SAndroid Build Coastguard Worker #define BENCHMARK_THREAD_TIMER_H
3*58b9f456SAndroid Build Coastguard Worker 
4*58b9f456SAndroid Build Coastguard Worker #include "check.h"
5*58b9f456SAndroid Build Coastguard Worker #include "timers.h"
6*58b9f456SAndroid Build Coastguard Worker 
7*58b9f456SAndroid Build Coastguard Worker namespace benchmark {
8*58b9f456SAndroid Build Coastguard Worker namespace internal {
9*58b9f456SAndroid Build Coastguard Worker 
10*58b9f456SAndroid Build Coastguard Worker class ThreadTimer {
11*58b9f456SAndroid Build Coastguard Worker  public:
12*58b9f456SAndroid Build Coastguard Worker   ThreadTimer() = default;
13*58b9f456SAndroid Build Coastguard Worker 
14*58b9f456SAndroid Build Coastguard Worker   // Called by each thread
StartTimer()15*58b9f456SAndroid Build Coastguard Worker   void StartTimer() {
16*58b9f456SAndroid Build Coastguard Worker     running_ = true;
17*58b9f456SAndroid Build Coastguard Worker     start_real_time_ = ChronoClockNow();
18*58b9f456SAndroid Build Coastguard Worker     start_cpu_time_ = ThreadCPUUsage();
19*58b9f456SAndroid Build Coastguard Worker   }
20*58b9f456SAndroid Build Coastguard Worker 
21*58b9f456SAndroid Build Coastguard Worker   // Called by each thread
StopTimer()22*58b9f456SAndroid Build Coastguard Worker   void StopTimer() {
23*58b9f456SAndroid Build Coastguard Worker     CHECK(running_);
24*58b9f456SAndroid Build Coastguard Worker     running_ = false;
25*58b9f456SAndroid Build Coastguard Worker     real_time_used_ += ChronoClockNow() - start_real_time_;
26*58b9f456SAndroid Build Coastguard Worker     // Floating point error can result in the subtraction producing a negative
27*58b9f456SAndroid Build Coastguard Worker     // time. Guard against that.
28*58b9f456SAndroid Build Coastguard Worker     cpu_time_used_ += std::max<double>(ThreadCPUUsage() - start_cpu_time_, 0);
29*58b9f456SAndroid Build Coastguard Worker   }
30*58b9f456SAndroid Build Coastguard Worker 
31*58b9f456SAndroid Build Coastguard Worker   // Called by each thread
SetIterationTime(double seconds)32*58b9f456SAndroid Build Coastguard Worker   void SetIterationTime(double seconds) { manual_time_used_ += seconds; }
33*58b9f456SAndroid Build Coastguard Worker 
running()34*58b9f456SAndroid Build Coastguard Worker   bool running() const { return running_; }
35*58b9f456SAndroid Build Coastguard Worker 
36*58b9f456SAndroid Build Coastguard Worker   // REQUIRES: timer is not running
real_time_used()37*58b9f456SAndroid Build Coastguard Worker   double real_time_used() {
38*58b9f456SAndroid Build Coastguard Worker     CHECK(!running_);
39*58b9f456SAndroid Build Coastguard Worker     return real_time_used_;
40*58b9f456SAndroid Build Coastguard Worker   }
41*58b9f456SAndroid Build Coastguard Worker 
42*58b9f456SAndroid Build Coastguard Worker   // REQUIRES: timer is not running
cpu_time_used()43*58b9f456SAndroid Build Coastguard Worker   double cpu_time_used() {
44*58b9f456SAndroid Build Coastguard Worker     CHECK(!running_);
45*58b9f456SAndroid Build Coastguard Worker     return cpu_time_used_;
46*58b9f456SAndroid Build Coastguard Worker   }
47*58b9f456SAndroid Build Coastguard Worker 
48*58b9f456SAndroid Build Coastguard Worker   // REQUIRES: timer is not running
manual_time_used()49*58b9f456SAndroid Build Coastguard Worker   double manual_time_used() {
50*58b9f456SAndroid Build Coastguard Worker     CHECK(!running_);
51*58b9f456SAndroid Build Coastguard Worker     return manual_time_used_;
52*58b9f456SAndroid Build Coastguard Worker   }
53*58b9f456SAndroid Build Coastguard Worker 
54*58b9f456SAndroid Build Coastguard Worker  private:
55*58b9f456SAndroid Build Coastguard Worker   bool running_ = false;        // Is the timer running
56*58b9f456SAndroid Build Coastguard Worker   double start_real_time_ = 0;  // If running_
57*58b9f456SAndroid Build Coastguard Worker   double start_cpu_time_ = 0;   // If running_
58*58b9f456SAndroid Build Coastguard Worker 
59*58b9f456SAndroid Build Coastguard Worker   // Accumulated time so far (does not contain current slice if running_)
60*58b9f456SAndroid Build Coastguard Worker   double real_time_used_ = 0;
61*58b9f456SAndroid Build Coastguard Worker   double cpu_time_used_ = 0;
62*58b9f456SAndroid Build Coastguard Worker   // Manually set iteration time. User sets this with SetIterationTime(seconds).
63*58b9f456SAndroid Build Coastguard Worker   double manual_time_used_ = 0;
64*58b9f456SAndroid Build Coastguard Worker };
65*58b9f456SAndroid Build Coastguard Worker 
66*58b9f456SAndroid Build Coastguard Worker }  // namespace internal
67*58b9f456SAndroid Build Coastguard Worker }  // namespace benchmark
68*58b9f456SAndroid Build Coastguard Worker 
69*58b9f456SAndroid Build Coastguard Worker #endif  // BENCHMARK_THREAD_TIMER_H
70