UFO 1.0.0
An Efficient Probabilistic 3D Mapping Framework That Embraces the Unknown
Loading...
Searching...
No Matches
timer.cpp
1// UFO
2#include <ufo/time/timer.hpp>
3
4namespace ufo
5{
6//
7// Public functions
8//
9
10void Timer::start() { start(std::chrono::high_resolution_clock::now()); }
11
12void Timer::pause()
13{
14 current_ += std::chrono::high_resolution_clock::now() - start_;
15 start_ = {};
16}
17
18void Timer::resume() { start(); }
19
20void Timer::reset()
21{
22 start_ = {};
23 current_ = std::chrono::high_resolution_clock::duration::zero();
24 samples_ = 0;
25 last_time_point_ = {};
26 last_ = std::chrono::high_resolution_clock::duration::zero();
27 total_ = std::chrono::high_resolution_clock::duration::zero();
28 mean_ =
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();
33}
34
35void Timer::resetCurrent()
36{
37 start_ = {};
38 current_ = std::chrono::high_resolution_clock::duration::zero();
39}
40
41void Timer::stop() { stop(std::chrono::high_resolution_clock::now()); }
42
44{
45 auto now = std::chrono::high_resolution_clock::now();
46 if (rhs.running() || rhs.paused()) {
47 rhs.stop(now);
48 }
49
50 if (last_time_point_ < rhs.last_time_point_) {
51 last_time_point_ = rhs.last_time_point_;
52 last_ = rhs.last_;
53 }
54
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_);
59
60 samples_ += rhs.samples_;
61 total_ += rhs.total_;
62 sum_squares_diffs_ += rhs.sum_squares_diffs_;
63 min_ = std::min(min_, rhs.min_);
64 max_ = std::max(max_, rhs.max_);
65
66 return *this;
67}
68
69Timer operator+(Timer lhs, Timer rhs)
70{
71 auto now = std::chrono::high_resolution_clock::now();
72 if (lhs.running() || lhs.paused()) {
73 lhs.stop(now);
74 }
75 if (rhs.running() || rhs.paused()) {
76 rhs.stop(now);
77 }
78
79 lhs += rhs;
80 return lhs;
81}
82
84{
85 auto now = std::chrono::high_resolution_clock::now();
86 if (rhs.running() || rhs.paused()) {
87 rhs.stop(now);
88 }
89
90 samples_ -= rhs.samples_;
91 total_ -= rhs.total_;
92 mean_ -= rhs.mean_;
93 sum_squares_diffs_ -= rhs.sum_squares_diffs_;
94 min_ -= std::min(min_, rhs.min_);
95 max_ -= std::max(max_, rhs.max_);
96
97 return *this;
98}
99
100Timer operator-(Timer lhs, Timer rhs)
101{
102 auto now = std::chrono::high_resolution_clock::now();
103 if (lhs.running() || lhs.paused()) {
104 lhs.stop(now);
105 }
106 if (rhs.running() || rhs.paused()) {
107 rhs.stop(now);
108 }
109
110 lhs -= rhs;
111 return lhs;
112}
113
114bool Timer::running() const
115{
116 return std::chrono::time_point<std::chrono::high_resolution_clock>{} != start_;
117}
118
119bool Timer::paused() const
120{
121 return !running() && std::chrono::high_resolution_clock::duration::zero() != current_;
122}
123
124double Timer::currentSeconds() const { return current<std::chrono::seconds::period>(); }
125
126double Timer::currentMilliseconds() const
127{
128 return current<std::chrono::milliseconds::period>();
129}
130
131double Timer::currentMicroseconds() const
132{
133 return current<std::chrono::microseconds::period>();
134}
135
136double Timer::currentNanoseconds() const
137{
138 return current<std::chrono::nanoseconds::period>();
139}
140
141double Timer::lastSeconds() const { return last<std::chrono::seconds::period>(); }
142
143double Timer::lastMilliseconds() const
144{
145 return last<std::chrono::milliseconds::period>();
146}
147
148double Timer::lastMicroseconds() const
149{
150 return last<std::chrono::microseconds::period>();
151}
152
153double Timer::lastNanoseconds() const { return last<std::chrono::nanoseconds::period>(); }
154
155double Timer::totalSeconds() const { return total<std::chrono::seconds::period>(); }
156
157double Timer::totalMilliseconds() const
158{
159 return total<std::chrono::milliseconds::period>();
160}
161
162double Timer::totalMicroseconds() const
163{
164 return total<std::chrono::microseconds::period>();
165}
166
167double Timer::totalNanoseconds() const
168{
169 return total<std::chrono::nanoseconds::period>();
170}
171
172double Timer::minSeconds() const { return min<std::chrono::seconds::period>(); }
173
174double Timer::minMilliseconds() const { return min<std::chrono::milliseconds::period>(); }
175
176double Timer::minMicroseconds() const { return min<std::chrono::microseconds::period>(); }
177
178double Timer::minNanoseconds() const { return min<std::chrono::nanoseconds::period>(); }
179
180double Timer::maxSeconds() const { return max<std::chrono::seconds::period>(); }
181
182double Timer::maxMilliseconds() const { return max<std::chrono::milliseconds::period>(); }
183
184double Timer::maxMicroseconds() const { return max<std::chrono::microseconds::period>(); }
185
186double Timer::maxNanoseconds() const { return max<std::chrono::nanoseconds::period>(); }
187
188double Timer::meanSeconds() const { return mean<std::chrono::seconds::period>(); }
189
190double Timer::meanMilliseconds() const
191{
192 return mean<std::chrono::milliseconds::period>();
193}
194
195double Timer::meanMicroseconds() const
196{
197 return mean<std::chrono::microseconds::period>();
198}
199
200double Timer::meanNanoseconds() const { return mean<std::chrono::nanoseconds::period>(); }
201
202double Timer::varianceSeconds() const { return variance<std::chrono::seconds::period>(); }
203
204double Timer::varianceMilliseconds() const
205{
206 return variance<std::chrono::milliseconds::period>();
207}
208
209double Timer::varianceMicroseconds() const
210{
211 return variance<std::chrono::microseconds::period>();
212}
213
214double Timer::varianceNanoseconds() const
215{
216 return variance<std::chrono::nanoseconds::period>();
217}
218
219double Timer::stdSeconds() const { return std<std::chrono::seconds::period>(); }
220
221double Timer::stdMilliseconds() const { return std<std::chrono::milliseconds::period>(); }
222
223double Timer::stdMicroseconds() const { return std<std::chrono::microseconds::period>(); }
224
225double Timer::stdNanoseconds() const { return std<std::chrono::nanoseconds::period>(); }
226
227double Timer::sampleVarianceSeconds() const
228{
229 return sampleVariance<std::chrono::seconds::period>();
230}
231
232double Timer::sampleVarianceMilliseconds() const
233{
234 return sampleVariance<std::chrono::milliseconds::period>();
235}
236
237double Timer::sampleVarianceMicroseconds() const
238{
239 return sampleVariance<std::chrono::microseconds::period>();
240}
241
242double Timer::sampleVarianceNanoseconds() const
243{
244 return sampleVariance<std::chrono::nanoseconds::period>();
245}
246
247double Timer::populationVarianceSeconds() const
248{
249 return populationVariance<std::chrono::seconds::period>();
250}
251
252double Timer::populationVarianceMilliseconds() const
253{
254 return populationVariance<std::chrono::milliseconds::period>();
255}
256
257double Timer::populationVarianceMicroseconds() const
258{
259 return populationVariance<std::chrono::microseconds::period>();
260}
261
262double Timer::populationVarianceNanoseconds() const
263{
264 return populationVariance<std::chrono::nanoseconds::period>();
265}
266
267int Timer::numSamples() const { return samples_; }
268
269//
270// Private functions
271//
272
273void Timer::start(std::chrono::time_point<std::chrono::high_resolution_clock> time)
274{
275 start_ = time;
276}
277
278void Timer::stop(std::chrono::time_point<std::chrono::high_resolution_clock> time)
279{
280 last_time_point_ = time;
281
282 last_ = paused() ? current_ : current_ + (time - start_);
283
284 start_ = {};
285 current_ = std::chrono::high_resolution_clock::duration::zero();
286
287 ++samples_;
288
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);
294
295 total_ += last_;
296 min_ = std::min(min_, last_);
297 max_ = std::max(max_, last_);
298}
299
300void Timer::addSample(std::chrono::time_point<std::chrono::high_resolution_clock> start,
301 std::chrono::time_point<std::chrono::high_resolution_clock> stop)
302{
303 auto elapsed = stop - start;
304
305 if (last_time_point_ < stop) {
306 last_time_point_ = stop;
307 last_ = elapsed;
308 }
309
310 ++samples_;
311
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);
317
318 total_ += elapsed;
319 min_ = std::min(min_, elapsed);
320 max_ = std::max(max_, elapsed);
321}
322} // namespace ufo
Timer & operator-=(Timer rhs)
Definition timer.cpp:83
Timer & operator+=(Timer rhs)
Definition timer.cpp:43
All vision-related classes and functions.
Definition cloud.hpp:49