1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TIMER_LAP_TIMER_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TIMER_LAP_TIMER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker namespace base { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker // LapTimer is used to calculate average times per "Lap" in perf tests. 15*6777b538SAndroid Build Coastguard Worker // NextLap increments the lap counter, used in counting the per lap averages. 16*6777b538SAndroid Build Coastguard Worker // If you initialize the LapTimer with a non zero |warmup_laps|, it will ignore 17*6777b538SAndroid Build Coastguard Worker // the times for that many laps at the start. 18*6777b538SAndroid Build Coastguard Worker // If you set the |time_limit| then you can use HasTimeLimitExpired() to see if 19*6777b538SAndroid Build Coastguard Worker // the current accumulated time has crossed that threshold, with an optimization 20*6777b538SAndroid Build Coastguard Worker // that it only tests this every |check_interval| laps. 21*6777b538SAndroid Build Coastguard Worker // 22*6777b538SAndroid Build Coastguard Worker // See base/timer/lap_timer_unittest.cc for a usage example. 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT LapTimer { 25*6777b538SAndroid Build Coastguard Worker public: 26*6777b538SAndroid Build Coastguard Worker enum class TimerMethod { 27*6777b538SAndroid Build Coastguard Worker // Measures CPU time consumed by the thread running the LapTimer. 28*6777b538SAndroid Build Coastguard Worker kUseThreadTicks, 29*6777b538SAndroid Build Coastguard Worker // Measures elapsed wall time (default). 30*6777b538SAndroid Build Coastguard Worker kUseTimeTicks 31*6777b538SAndroid Build Coastguard Worker }; 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker LapTimer(int warmup_laps, 34*6777b538SAndroid Build Coastguard Worker TimeDelta time_limit, 35*6777b538SAndroid Build Coastguard Worker int check_interval, 36*6777b538SAndroid Build Coastguard Worker TimerMethod timing_method = TimerMethod::kUseTimeTicks); 37*6777b538SAndroid Build Coastguard Worker // Create LapTimer with sensible default values. 38*6777b538SAndroid Build Coastguard Worker LapTimer(TimerMethod timing_method = TimerMethod::kUseTimeTicks); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker LapTimer(const LapTimer&) = delete; 41*6777b538SAndroid Build Coastguard Worker LapTimer& operator=(const LapTimer&) = delete; 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // Sets the timer back to its starting state. 44*6777b538SAndroid Build Coastguard Worker void Reset(); 45*6777b538SAndroid Build Coastguard Worker // Sets the start point to now. 46*6777b538SAndroid Build Coastguard Worker void Start(); 47*6777b538SAndroid Build Coastguard Worker // Returns true if there are no more warmup laps to do. 48*6777b538SAndroid Build Coastguard Worker bool IsWarmedUp() const; 49*6777b538SAndroid Build Coastguard Worker // Advance the lap counter and update the accumulated time. 50*6777b538SAndroid Build Coastguard Worker // The accumulated time is only updated every check_interval laps. 51*6777b538SAndroid Build Coastguard Worker // If accumulating then the start point will also be updated. 52*6777b538SAndroid Build Coastguard Worker void NextLap(); 53*6777b538SAndroid Build Coastguard Worker // Returns true if the stored time has exceeded the time limit specified. 54*6777b538SAndroid Build Coastguard Worker // May cause a call to Store(). 55*6777b538SAndroid Build Coastguard Worker bool HasTimeLimitExpired() const; 56*6777b538SAndroid Build Coastguard Worker // The average time taken per lap. 57*6777b538SAndroid Build Coastguard Worker TimeDelta TimePerLap() const; 58*6777b538SAndroid Build Coastguard Worker // The number of laps per second. 59*6777b538SAndroid Build Coastguard Worker float LapsPerSecond() const; 60*6777b538SAndroid Build Coastguard Worker // The number of laps recorded. 61*6777b538SAndroid Build Coastguard Worker int NumLaps() const; 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker private: 64*6777b538SAndroid Build Coastguard Worker // Returns true if all lap times have been timed. Only true every n'th 65*6777b538SAndroid Build Coastguard Worker // lap, where n = check_interval. 66*6777b538SAndroid Build Coastguard Worker bool HasTimedAllLaps() const; 67*6777b538SAndroid Build Coastguard Worker // Returns the current accumulated time. 68*6777b538SAndroid Build Coastguard Worker TimeDelta GetAccumulatedTime() const; 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker const int warmup_laps_; 71*6777b538SAndroid Build Coastguard Worker const TimeDelta time_limit_; 72*6777b538SAndroid Build Coastguard Worker const int check_interval_; 73*6777b538SAndroid Build Coastguard Worker const TimerMethod method_; 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker ThreadTicks start_thread_ticks_; 76*6777b538SAndroid Build Coastguard Worker TimeTicks start_time_ticks_; 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker ThreadTicks last_timed_lap_end_thread_ticks_; 79*6777b538SAndroid Build Coastguard Worker TimeTicks last_timed_lap_end_ticks_; 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker int num_laps_; 82*6777b538SAndroid Build Coastguard Worker int remaining_warmups_ = 0; 83*6777b538SAndroid Build Coastguard Worker int remaining_no_check_laps_ = 0; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker SEQUENCE_CHECKER(sequence_checker_); 86*6777b538SAndroid Build Coastguard Worker }; 87*6777b538SAndroid Build Coastguard Worker } // namespace base 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker #endif // BASE_TIMER_LAP_TIMER_H_ 90