#ifndef BENCHMARK_THREAD_TIMER_H
#define BENCHMARK_THREAD_TIMER_H
#include "check.h"
#include "timers.h"
namespace benchmark {
namespace internal {
class ThreadTimer {
explicit ThreadTimer(bool measure_process_cpu_time_)
: measure_process_cpu_time(measure_process_cpu_time_) {}
public:
static ThreadTimer Create() {
return ThreadTimer(false);
}
static ThreadTimer CreateProcessCpuTime() {
return ThreadTimer(true);
}
void StartTimer() {
running_ = true;
start_real_time_ = ChronoClockNow();
start_cpu_time_ = ReadCpuTimerOfChoice();
}
void StopTimer() {
BM_CHECK(running_);
running_ = false;
real_time_used_ += ChronoClockNow() - start_real_time_;
cpu_time_used_ +=
std::max<double>(ReadCpuTimerOfChoice() - start_cpu_time_, 0);
}
void SetIterationTime(double seconds) { manual_time_used_ += seconds; }
bool running() const { return running_; }
double real_time_used() const {
BM_CHECK(!running_);
return real_time_used_;
}
double cpu_time_used() const {
BM_CHECK(!running_);
return cpu_time_used_;
}
double manual_time_used() const {
BM_CHECK(!running_);
return manual_time_used_;
}
private:
double ReadCpuTimerOfChoice() const {
if (measure_process_cpu_time) return ProcessCPUUsage();
return ThreadCPUUsage();
}
const bool measure_process_cpu_time;
bool running_ = false; double start_real_time_ = 0; double start_cpu_time_ = 0;
double real_time_used_ = 0;
double cpu_time_used_ = 0;
double manual_time_used_ = 0;
};
} }
#endif