|  | // Copyright 2014 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_TIMER_LAP_TIMER_H_ | 
|  | #define BASE_TIMER_LAP_TIMER_H_ | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/sequence_checker.h" | 
|  | #include "base/time/time.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // LapTimer is used to calculate average times per "Lap" in perf tests. | 
|  | // NextLap increments the lap counter, used in counting the per lap averages. | 
|  | // If you initialize the LapTimer with a non zero |warmup_laps|, it will ignore | 
|  | // the times for that many laps at the start. | 
|  | // If you set the |time_limit| then you can use HasTimeLimitExpired() to see if | 
|  | // the current accumulated time has crossed that threshold, with an optimization | 
|  | // that it only tests this every |check_interval| laps. | 
|  | // | 
|  | // See base/timer/lap_timer_unittest.cc for a usage example. | 
|  | // | 
|  | class BASE_EXPORT LapTimer { | 
|  | public: | 
|  | enum class TimerMethod { | 
|  | // Measures CPU time consumed by the thread running the LapTimer. | 
|  | kUseThreadTicks, | 
|  | // Measures elapsed wall time (default). | 
|  | kUseTimeTicks | 
|  | }; | 
|  |  | 
|  | LapTimer(int warmup_laps, | 
|  | TimeDelta time_limit, | 
|  | int check_interval, | 
|  | TimerMethod timing_method = TimerMethod::kUseTimeTicks); | 
|  | // Create LapTimer with sensible default values. | 
|  | LapTimer(TimerMethod timing_method = TimerMethod::kUseTimeTicks); | 
|  |  | 
|  | LapTimer(const LapTimer&) = delete; | 
|  | LapTimer& operator=(const LapTimer&) = delete; | 
|  |  | 
|  | // Sets the timer back to its starting state. | 
|  | void Reset(); | 
|  | // Sets the start point to now. | 
|  | void Start(); | 
|  | // Returns true if there are no more warmup laps to do. | 
|  | bool IsWarmedUp() const; | 
|  | // Advance the lap counter and update the accumulated time. | 
|  | // The accumulated time is only updated every check_interval laps. | 
|  | // If accumulating then the start point will also be updated. | 
|  | void NextLap(); | 
|  | // Returns true if the stored time has exceeded the time limit specified. | 
|  | // May cause a call to Store(). | 
|  | bool HasTimeLimitExpired() const; | 
|  | // The average time taken per lap. | 
|  | TimeDelta TimePerLap() const; | 
|  | // The number of laps per second. | 
|  | float LapsPerSecond() const; | 
|  | // The number of laps recorded. | 
|  | int NumLaps() const; | 
|  |  | 
|  | private: | 
|  | // Returns true if all lap times have been timed. Only true every n'th | 
|  | // lap, where n = check_interval. | 
|  | bool HasTimedAllLaps() const; | 
|  | // Returns the current accumulated time. | 
|  | TimeDelta GetAccumulatedTime() const; | 
|  |  | 
|  | const int warmup_laps_; | 
|  | const TimeDelta time_limit_; | 
|  | const int check_interval_; | 
|  | const TimerMethod method_; | 
|  |  | 
|  | ThreadTicks start_thread_ticks_; | 
|  | TimeTicks start_time_ticks_; | 
|  |  | 
|  | ThreadTicks last_timed_lap_end_thread_ticks_; | 
|  | TimeTicks last_timed_lap_end_ticks_; | 
|  |  | 
|  | int num_laps_; | 
|  | int remaining_warmups_ = 0; | 
|  | int remaining_no_check_laps_ = 0; | 
|  |  | 
|  | SEQUENCE_CHECKER(sequence_checker_); | 
|  | }; | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_TIMER_LAP_TIMER_H_ |