109 [[nodiscard]]
bool running()
const;
111 [[nodiscard]]
bool paused()
const;
113 template <
class Period = std::chrono::seconds::period>
114 [[nodiscard]]
double current()
const
116 return toDouble<Period>(
117 running() ? current_ + (std::chrono::high_resolution_clock::now() - start_)
121 [[nodiscard]]
double currentSeconds()
const;
123 [[nodiscard]]
double currentMilliseconds()
const;
125 [[nodiscard]]
double currentMicroseconds()
const;
127 [[nodiscard]]
double currentNanoseconds()
const;
129 template <
class Period = std::chrono::seconds::period>
130 [[nodiscard]]
double last()
const
132 return toDouble<Period>(last_);
135 [[nodiscard]]
double lastSeconds()
const;
137 [[nodiscard]]
double lastMilliseconds()
const;
139 [[nodiscard]]
double lastMicroseconds()
const;
141 [[nodiscard]]
double lastNanoseconds()
const;
143 template <
class Period = std::chrono::seconds::period>
144 [[nodiscard]]
double total()
const
146 return current<Period>() + toDouble<Period>(total_);
149 [[nodiscard]]
double totalSeconds()
const;
151 [[nodiscard]]
double totalMilliseconds()
const;
153 [[nodiscard]]
double totalMicroseconds()
const;
155 [[nodiscard]]
double totalNanoseconds()
const;
157 template <
class Period = std::chrono::seconds::period>
158 [[nodiscard]]
double min()
const
160 return 0 < numSamples() ? toDouble<Period>(min_)
161 : std::numeric_limits<double>::quiet_NaN();
164 [[nodiscard]]
double minSeconds()
const;
166 [[nodiscard]]
double minMilliseconds()
const;
168 [[nodiscard]]
double minMicroseconds()
const;
170 [[nodiscard]]
double minNanoseconds()
const;
172 template <
class Period = std::chrono::seconds::period>
173 [[nodiscard]]
double max()
const
175 return 0 < numSamples() ? toDouble<Period>(max_)
176 : std::numeric_limits<double>::quiet_NaN();
179 [[nodiscard]]
double maxSeconds()
const;
181 [[nodiscard]]
double maxMilliseconds()
const;
183 [[nodiscard]]
double maxMicroseconds()
const;
185 [[nodiscard]]
double maxNanoseconds()
const;
187 template <
class Period = std::chrono::seconds::period>
188 [[nodiscard]]
double mean()
const
190 return toDouble<Period>(mean_);
193 [[nodiscard]]
double meanSeconds()
const;
195 [[nodiscard]]
double meanMilliseconds()
const;
197 [[nodiscard]]
double meanMicroseconds()
const;
199 [[nodiscard]]
double meanNanoseconds()
const;
201 template <
class Period = std::chrono::seconds::period>
202 [[nodiscard]]
double variance()
const
204 return populationVariance<Period>();
207 [[nodiscard]]
double varianceSeconds()
const;
209 [[nodiscard]]
double varianceMilliseconds()
const;
211 [[nodiscard]]
double varianceMicroseconds()
const;
213 [[nodiscard]]
double varianceNanoseconds()
const;
215 template <
class Period = std::chrono::seconds::period>
216 [[nodiscard]]
double std()
const
218 return std::sqrt(variance<Period>());
221 [[nodiscard]]
double stdSeconds()
const;
223 [[nodiscard]]
double stdMilliseconds()
const;
225 [[nodiscard]]
double stdMicroseconds()
const;
227 [[nodiscard]]
double stdNanoseconds()
const;
229 template <
class Period = std::chrono::seconds::period>
230 [[nodiscard]]
double sampleVariance()
const
232 constexpr long double s =
233 static_cast<long double>(Period::den) /
static_cast<long double>(Period::num);
234 return 1 < numSamples()
235 ?
static_cast<double>(s * s * (sum_squares_diffs_ / (numSamples() - 1)))
236 : std::numeric_limits<double>::quiet_NaN();
239 [[nodiscard]]
double sampleVarianceSeconds()
const;
241 [[nodiscard]]
double sampleVarianceMilliseconds()
const;
243 [[nodiscard]]
double sampleVarianceMicroseconds()
const;
245 [[nodiscard]]
double sampleVarianceNanoseconds()
const;
247 template <
class Period = std::chrono::seconds::period>
248 [[nodiscard]]
double populationVariance()
const
250 constexpr long double s =
251 static_cast<long double>(Period::den) /
static_cast<long double>(Period::num);
252 return 0 < numSamples()
253 ?
static_cast<double>(s * s * (sum_squares_diffs_ / numSamples()))
254 : std::numeric_limits<double>::quiet_NaN();
257 [[nodiscard]]
double populationVarianceSeconds()
const;
259 [[nodiscard]]
double populationVarianceMilliseconds()
const;
261 [[nodiscard]]
double populationVarianceMicroseconds()
const;
263 [[nodiscard]]
double populationVarianceNanoseconds()
const;
265 [[nodiscard]]
int numSamples()
const;
268 void start(std::chrono::time_point<std::chrono::high_resolution_clock> time);
270 void stop(std::chrono::time_point<std::chrono::high_resolution_clock> time);
272 void addSample(std::chrono::time_point<std::chrono::high_resolution_clock> start,
273 std::chrono::time_point<std::chrono::high_resolution_clock> stop);
276 template <
class Period,
class Duration>
277 [[nodiscard]]
static constexpr double toDouble(Duration dur)
279 return std::chrono::duration<double, Period>(dur).count();
283 std::chrono::time_point<std::chrono::high_resolution_clock> start_ = {};
285 std::chrono::high_resolution_clock::duration current_ =
286 std::chrono::high_resolution_clock::duration::zero();
290 std::chrono::time_point<std::chrono::high_resolution_clock> last_time_point_ = {};
291 std::chrono::high_resolution_clock::duration last_ =
292 std::chrono::high_resolution_clock::duration::zero();
293 std::chrono::high_resolution_clock::duration total_ =
294 std::chrono::high_resolution_clock::duration::zero();
295 std::chrono::duration<double, std::chrono::high_resolution_clock::period> mean_ =
296 std::chrono::duration<double, std::chrono::high_resolution_clock::period>::zero();
297 double sum_squares_diffs_ = 0.0;
298 std::chrono::high_resolution_clock::duration min_ =
299 std::chrono::high_resolution_clock::duration::max();
300 std::chrono::high_resolution_clock::duration max_ =
301 std::chrono::high_resolution_clock::duration::min();