2#include <ufo/time/timer.hpp>
10void Timer::start() { start(std::chrono::high_resolution_clock::now()); }
14 current_ += std::chrono::high_resolution_clock::now() - start_;
18void Timer::resume() { start(); }
23 current_ = std::chrono::high_resolution_clock::duration::zero();
25 last_time_point_ = {};
26 last_ = std::chrono::high_resolution_clock::duration::zero();
27 total_ = std::chrono::high_resolution_clock::duration::zero();
29 std::chrono::duration<double, std::chrono::high_resolution_clock::period>::zero();
30 sum_squares_diffs_ = 0.0;
31 min_ = std::chrono::high_resolution_clock::duration::max();
32 max_ = std::chrono::high_resolution_clock::duration::min();
35void Timer::resetCurrent()
38 current_ = std::chrono::high_resolution_clock::duration::zero();
41void Timer::stop() { stop(std::chrono::high_resolution_clock::now()); }
45 auto now = std::chrono::high_resolution_clock::now();
46 if (rhs.running() || rhs.paused()) {
50 if (last_time_point_ < rhs.last_time_point_) {
51 last_time_point_ = rhs.last_time_point_;
55 mean_ = 0 == samples_ + rhs.samples_
56 ? std::chrono::duration<double,
57 std::chrono::high_resolution_clock::period>::zero()
58 : (total_ + rhs.total_) /
static_cast<double>(samples_ + rhs.samples_);
60 samples_ += rhs.samples_;
62 sum_squares_diffs_ += rhs.sum_squares_diffs_;
63 min_ = std::min(min_, rhs.min_);
64 max_ = std::max(max_, rhs.max_);
71 auto now = std::chrono::high_resolution_clock::now();
72 if (lhs.running() || lhs.paused()) {
75 if (rhs.running() || rhs.paused()) {
85 auto now = std::chrono::high_resolution_clock::now();
86 if (rhs.running() || rhs.paused()) {
90 samples_ -= rhs.samples_;
93 sum_squares_diffs_ -= rhs.sum_squares_diffs_;
94 min_ -= std::min(min_, rhs.min_);
95 max_ -= std::max(max_, rhs.max_);
102 auto now = std::chrono::high_resolution_clock::now();
103 if (lhs.running() || lhs.paused()) {
106 if (rhs.running() || rhs.paused()) {
114bool Timer::running()
const
116 return std::chrono::time_point<std::chrono::high_resolution_clock>{} != start_;
119bool Timer::paused()
const
121 return !running() && std::chrono::high_resolution_clock::duration::zero() != current_;
124double Timer::currentSeconds()
const {
return current<std::chrono::seconds::period>(); }
126double Timer::currentMilliseconds()
const
128 return current<std::chrono::milliseconds::period>();
131double Timer::currentMicroseconds()
const
133 return current<std::chrono::microseconds::period>();
136double Timer::currentNanoseconds()
const
138 return current<std::chrono::nanoseconds::period>();
141double Timer::lastSeconds()
const {
return last<std::chrono::seconds::period>(); }
143double Timer::lastMilliseconds()
const
145 return last<std::chrono::milliseconds::period>();
148double Timer::lastMicroseconds()
const
150 return last<std::chrono::microseconds::period>();
153double Timer::lastNanoseconds()
const {
return last<std::chrono::nanoseconds::period>(); }
155double Timer::totalSeconds()
const {
return total<std::chrono::seconds::period>(); }
157double Timer::totalMilliseconds()
const
159 return total<std::chrono::milliseconds::period>();
162double Timer::totalMicroseconds()
const
164 return total<std::chrono::microseconds::period>();
167double Timer::totalNanoseconds()
const
169 return total<std::chrono::nanoseconds::period>();
172double Timer::minSeconds()
const {
return min<std::chrono::seconds::period>(); }
174double Timer::minMilliseconds()
const {
return min<std::chrono::milliseconds::period>(); }
176double Timer::minMicroseconds()
const {
return min<std::chrono::microseconds::period>(); }
178double Timer::minNanoseconds()
const {
return min<std::chrono::nanoseconds::period>(); }
180double Timer::maxSeconds()
const {
return max<std::chrono::seconds::period>(); }
182double Timer::maxMilliseconds()
const {
return max<std::chrono::milliseconds::period>(); }
184double Timer::maxMicroseconds()
const {
return max<std::chrono::microseconds::period>(); }
186double Timer::maxNanoseconds()
const {
return max<std::chrono::nanoseconds::period>(); }
188double Timer::meanSeconds()
const {
return mean<std::chrono::seconds::period>(); }
190double Timer::meanMilliseconds()
const
192 return mean<std::chrono::milliseconds::period>();
195double Timer::meanMicroseconds()
const
197 return mean<std::chrono::microseconds::period>();
200double Timer::meanNanoseconds()
const {
return mean<std::chrono::nanoseconds::period>(); }
202double Timer::varianceSeconds()
const {
return variance<std::chrono::seconds::period>(); }
204double Timer::varianceMilliseconds()
const
206 return variance<std::chrono::milliseconds::period>();
209double Timer::varianceMicroseconds()
const
211 return variance<std::chrono::microseconds::period>();
214double Timer::varianceNanoseconds()
const
216 return variance<std::chrono::nanoseconds::period>();
219double Timer::stdSeconds()
const {
return std<std::chrono::seconds::period>(); }
221double Timer::stdMilliseconds()
const {
return std<std::chrono::milliseconds::period>(); }
223double Timer::stdMicroseconds()
const {
return std<std::chrono::microseconds::period>(); }
225double Timer::stdNanoseconds()
const {
return std<std::chrono::nanoseconds::period>(); }
227double Timer::sampleVarianceSeconds()
const
229 return sampleVariance<std::chrono::seconds::period>();
232double Timer::sampleVarianceMilliseconds()
const
234 return sampleVariance<std::chrono::milliseconds::period>();
237double Timer::sampleVarianceMicroseconds()
const
239 return sampleVariance<std::chrono::microseconds::period>();
242double Timer::sampleVarianceNanoseconds()
const
244 return sampleVariance<std::chrono::nanoseconds::period>();
247double Timer::populationVarianceSeconds()
const
249 return populationVariance<std::chrono::seconds::period>();
252double Timer::populationVarianceMilliseconds()
const
254 return populationVariance<std::chrono::milliseconds::period>();
257double Timer::populationVarianceMicroseconds()
const
259 return populationVariance<std::chrono::microseconds::period>();
262double Timer::populationVarianceNanoseconds()
const
264 return populationVariance<std::chrono::nanoseconds::period>();
267int Timer::numSamples()
const {
return samples_; }
273void Timer::start(std::chrono::time_point<std::chrono::high_resolution_clock> time)
278void Timer::stop(std::chrono::time_point<std::chrono::high_resolution_clock> time)
280 last_time_point_ = time;
282 last_ = paused() ? current_ : current_ + (time - start_);
285 current_ = std::chrono::high_resolution_clock::duration::zero();
289 auto delta_1 = std::chrono::duration<double>(last_ - mean_);
290 mean_ += delta_1 / samples_;
291 auto delta_2 = std::chrono::duration<double>(last_ - mean_);
292 sum_squares_diffs_ += toDouble<std::chrono::seconds::period>(delta_1) *
293 toDouble<std::chrono::seconds::period>(delta_2);
296 min_ = std::min(min_, last_);
297 max_ = std::max(max_, last_);
300void Timer::addSample(std::chrono::time_point<std::chrono::high_resolution_clock> start,
301 std::chrono::time_point<std::chrono::high_resolution_clock> stop)
303 auto elapsed = stop - start;
305 if (last_time_point_ < stop) {
306 last_time_point_ = stop;
312 auto delta_1 = std::chrono::duration<double>(elapsed - mean_);
313 mean_ += delta_1 / samples_;
314 auto delta_2 = std::chrono::duration<double>(elapsed - mean_);
315 sum_squares_diffs_ += toDouble<std::chrono::seconds::period>(delta_1) *
316 toDouble<std::chrono::seconds::period>(delta_2);
319 min_ = std::min(min_, elapsed);
320 max_ = std::max(max_, elapsed);
Timer & operator-=(Timer rhs)
Timer & operator+=(Timer rhs)
All vision-related classes and functions.