1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file. 4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/debug/lap_timer.h" 6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/logging.h" 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace cc { 10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)base::TimeTicks Now() { 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return base::TimeTicks::IsThreadNowSupported() 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ? base::TimeTicks::ThreadNow() 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : base::TimeTicks::HighResNow(); 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)LapTimer::LapTimer(int warmup_laps, 22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::TimeDelta time_limit, 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int check_interval) 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : warmup_laps_(warmup_laps), 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) remaining_warmups_(0), 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) remaining_no_check_laps_(0), 27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) time_limit_(time_limit), 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) check_interval_(check_interval) { 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK_GT(check_interval, 0); 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Reset(); 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void LapTimer::Reset() { 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) accumulator_ = base::TimeDelta(); 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) num_laps_ = 0; 36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) remaining_warmups_ = warmup_laps_; 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) remaining_no_check_laps_ = check_interval_; 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Start(); 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void LapTimer::Start() { 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) start_time_ = Now(); 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool LapTimer::IsWarmedUp() { return remaining_warmups_ <= 0; } 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void LapTimer::NextLap() { 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!IsWarmedUp()) { 49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) --remaining_warmups_; 50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (IsWarmedUp()) { 51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Start(); 52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return; 54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ++num_laps_; 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) --remaining_no_check_laps_; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!remaining_no_check_laps_) { 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeTicks now = Now(); 59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) accumulator_ += now - start_time_; 60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) start_time_ = now; 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) remaining_no_check_laps_ = check_interval_; 62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool LapTimer::HasTimeLimitExpired() { return accumulator_ >= time_limit_; } 66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool LapTimer::HasTimedAllLaps() { return !(num_laps_ % check_interval_); } 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)float LapTimer::MsPerLap() { 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(HasTimedAllLaps()); 71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return accumulator_.InMillisecondsF() / num_laps_; 72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)float LapTimer::LapsPerSecond() { 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(HasTimedAllLaps()); 76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return num_laps_ / accumulator_.InSecondsF(); 77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int LapTimer::NumLaps() { return num_laps_; } 80424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} // namespace cc 82