Thanks to visit codestin.com
Credit goes to chromium.googlesource.com

blob: 55f5217dd673bc66a10d73159a3ad99be9944ea8 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2014 The Chromium Authors
Richard Townsend5d0b4772019-03-06 13:33:302// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/timer/lap_timer.h"
Peter Kasting134ef9af2024-12-28 02:30:096
Hans Wennborgc3cffa62020-04-27 10:09:127#include "base/check_op.h"
Richard Townsend5d0b4772019-03-06 13:33:308
9namespace base {
10
11namespace {
12
13// Default values.
Peter Kasting53fd6ee2021-10-05 20:40:4814constexpr TimeDelta kDefaultTimeLimit = Seconds(3);
Richard Townsend5d0b4772019-03-06 13:33:3015constexpr int kDefaultWarmupRuns = 5;
16constexpr int kDefaultTimeCheckInterval = 10;
17
18} // namespace
19
20LapTimer::LapTimer(int warmup_laps,
21 TimeDelta time_limit,
22 int check_interval,
23 LapTimer::TimerMethod method)
24 : warmup_laps_(warmup_laps),
25 time_limit_(time_limit),
26 check_interval_(check_interval),
27 method_(method) {
28 DETACH_FROM_SEQUENCE(sequence_checker_);
29 DCHECK_GT(check_interval, 0);
30 Reset();
31}
32
33LapTimer::LapTimer(LapTimer::TimerMethod method)
34 : LapTimer(kDefaultWarmupRuns,
35 kDefaultTimeLimit,
36 kDefaultTimeCheckInterval,
37 method) {}
38
39void LapTimer::Reset() {
40 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Peter Kasting134ef9af2024-12-28 02:30:0941 if (ThreadTicks::IsSupported() && method_ == TimerMethod::kUseThreadTicks) {
Richard Townsend5d0b4772019-03-06 13:33:3042 ThreadTicks::WaitUntilInitialized();
Peter Kasting134ef9af2024-12-28 02:30:0943 }
Richard Townsend5d0b4772019-03-06 13:33:3044 num_laps_ = 0;
45 remaining_warmups_ = warmup_laps_;
46 remaining_no_check_laps_ = check_interval_;
47 Start();
48}
49
50void LapTimer::Start() {
51 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
52 DCHECK_EQ(num_laps_, 0);
53 // last_timed_ variables are initialized here (instead of in the constructor)
54 // because not all platforms support ThreadTicks.
55 if (method_ == TimerMethod::kUseThreadTicks) {
56 start_thread_ticks_ = ThreadTicks::Now();
57 last_timed_lap_end_thread_ticks_ = ThreadTicks::Now();
58 } else {
59 start_time_ticks_ = TimeTicks::Now();
60 last_timed_lap_end_ticks_ = TimeTicks::Now();
61 }
62}
63
64bool LapTimer::IsWarmedUp() const {
65 return remaining_warmups_ <= 0;
66}
67
68void LapTimer::NextLap() {
69 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
70 DCHECK(!start_thread_ticks_.is_null() || !start_time_ticks_.is_null());
71 if (!IsWarmedUp()) {
72 --remaining_warmups_;
73 if (IsWarmedUp()) {
74 Start();
75 }
76 return;
77 }
78 ++num_laps_;
79 --remaining_no_check_laps_;
80 if (!remaining_no_check_laps_) {
81 if (method_ == TimerMethod::kUseTimeTicks) {
82 last_timed_lap_end_ticks_ = TimeTicks::Now();
83 } else {
84 last_timed_lap_end_thread_ticks_ = ThreadTicks::Now();
85 }
86 remaining_no_check_laps_ = check_interval_;
87 }
88}
89
90TimeDelta LapTimer::GetAccumulatedTime() const {
91 if (method_ == TimerMethod::kUseTimeTicks) {
92 return last_timed_lap_end_ticks_ - start_time_ticks_;
93 }
94 return last_timed_lap_end_thread_ticks_ - start_thread_ticks_;
95}
96
97bool LapTimer::HasTimeLimitExpired() const {
98 return GetAccumulatedTime() >= time_limit_;
99}
100
101bool LapTimer::HasTimedAllLaps() const {
102 return num_laps_ && !(num_laps_ % check_interval_);
103}
104
105TimeDelta LapTimer::TimePerLap() const {
106 DCHECK(HasTimedAllLaps());
107 DCHECK_GT(num_laps_, 0);
108 return GetAccumulatedTime() / num_laps_;
109}
110
111float LapTimer::LapsPerSecond() const {
112 DCHECK(HasTimedAllLaps());
113 DCHECK_GT(num_laps_, 0);
114 return num_laps_ / GetAccumulatedTime().InSecondsF();
115}
116
117int LapTimer::NumLaps() const {
118 return num_laps_;
119}
120} // namespace base