Add start/pause to Timer

This commit is contained in:
Jacob Dufault 2017-10-20 13:56:26 -07:00
parent 76cc110cc2
commit f0e9434163
2 changed files with 41 additions and 16 deletions

View File

@ -10,33 +10,47 @@ Timer::Timer() {
long long Timer::ElapsedMicroseconds() const { long long Timer::ElapsedMicroseconds() const {
std::chrono::time_point<Clock> end = Clock::now(); std::chrono::time_point<Clock> end = Clock::now();
return std::chrono::duration_cast<std::chrono::microseconds>(end - start) long long elapsed = elapsed_;
.count(); if (start_.has_value()) {
// TODO: clang-format this file.
elapsed += std::chrono::duration_cast<std::chrono::microseconds>(end - *start_).count();
}
return elapsed;
} }
long long Timer::ElapsedMicrosecondsAndReset() { long long Timer::ElapsedMicrosecondsAndReset() {
std::chrono::time_point<Clock> end = Clock::now(); long long elapsed = ElapsedMicroseconds();
long long microseconds =
std::chrono::duration_cast<std::chrono::microseconds>(end - start)
.count();
Reset(); Reset();
return microseconds; return elapsed;
} }
void Timer::Reset() { void Timer::Reset() {
start = Clock::now(); start_ = Clock::now();
elapsed_ = 0;
} }
void Timer::ResetAndPrint(const std::string& message) { void Timer::ResetAndPrint(const std::string& message) {
std::chrono::time_point<Clock> end = Clock::now(); long long elapsed = ElapsedMicroseconds();
long long elapsed =
std::chrono::duration_cast<std::chrono::microseconds>(end - start)
.count();
long long milliseconds = elapsed / 1000; long long milliseconds = elapsed / 1000;
long long remaining = elapsed - milliseconds; long long remaining = elapsed - milliseconds;
LOG_S(INFO) << message << " took " << milliseconds << "." << remaining LOG_S(INFO) << message << " took " << milliseconds << "." << remaining
<< "ms"; << "ms";
Reset(); Reset();
} }
void Timer::Pause() {
assert(start_.has_value());
std::chrono::time_point<Clock> end = Clock::now();
long long elapsed =
std::chrono::duration_cast<std::chrono::microseconds>(end - *start_)
.count();
elapsed_ += elapsed;
start_ = nullopt;
}
void Timer::Resume() {
assert(!start_.has_value());
start_ = Clock::now();
}

View File

@ -1,8 +1,13 @@
#pragma once #pragma once
#include <optional.h>
#include <chrono> #include <chrono>
#include <string> #include <string>
using std::experimental::nullopt;
using std::experimental::optional;
struct Timer { struct Timer {
using Clock = std::chrono::high_resolution_clock; using Clock = std::chrono::high_resolution_clock;
@ -17,7 +22,13 @@ struct Timer {
void Reset(); void Reset();
// Resets timer and prints a message like "<foo> took 5ms" // Resets timer and prints a message like "<foo> took 5ms"
void ResetAndPrint(const std::string& message); void ResetAndPrint(const std::string& message);
// Pause the timer.
void Pause();
// Resume the timer after it has been paused.
void Resume();
// Raw start time. // Raw start time.
std::chrono::time_point<Clock> start; optional<std::chrono::time_point<Clock>> start_;
// Elapsed time.
long long elapsed_ = 0;
}; };