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