11#ifndef EXECUTION_TIME_WINDOW_STATS_HPP
12#define EXECUTION_TIME_WINDOW_STATS_HPP
55 _start = clock_t::now();
68 const auto stop = clock_t::now();
73 const double elapsed_ms =
74 std::chrono::duration<double, std::milli>(stop - _start).count();
75 append_duration(elapsed_ms);
104 std::size_t
size()
const {
return _samples.size(); }
112 if (_samples.empty()) {
115 return _sum /
static_cast<double>(_samples.size());
129 if (_samples.empty()) {
132 const double n =
static_cast<double>(_samples.size());
133 const double mean = _sum / n;
134 const double variance = std::max(0.0, (_sum_sq / n) - (mean * mean));
135 return std::sqrt(variance);
149 using clock_t = std::chrono::steady_clock;
156 void append_duration(
double duration_ms) {
157 if (_window_width == 0) {
160 _samples.push_back(duration_ms);
162 _sum_sq += duration_ms * duration_ms;
169 void trim_to_window() {
170 while (_samples.size() > _window_width) {
171 const double oldest = _samples.front();
172 _samples.pop_front();
174 _sum_sq -= oldest * oldest;
176 if (_samples.empty()) {
182 std::size_t _window_width = 0;
183 std::deque<double> _samples;
185 double _sum_sq = 0.0;
186 clock_t::time_point _start{};
187 bool _ticking =
false;
Running window statistics for execution time samples.
double toc()
Mark the stop time, compute elapsed time, and append it.
void clear()
Clear all stored samples and reset timing state.
double stddev_ms() const
Get the population standard deviation of stored samples.
ExecutionTimeWindowStats(std::size_t window_width=100)
Construct a statistics window with a maximum number of samples.
std::size_t size() const
Get the number of currently stored samples.
std::size_t window_width() const
Get the current configured window width.
double average_ms() const
Get the arithmetic mean of stored samples.
void set_window_width(std::size_t window_width)
Set the running window width at runtime.
void tic()
Mark the start time of the next measured interval.