Added TimeSegmentAdder class and got benchmark output looking ok.

This commit is contained in:
Mike Dussault 2021-10-11 21:12:46 +00:00
parent 305af08112
commit 9370cfe25c
2 changed files with 55 additions and 12 deletions

View File

@ -83,4 +83,42 @@ Duration duration_cast(timeval const &tv) {
} }
} }
//
// This can be used for benchmarking. It will measure the time in between
// its constructor and destructor (or when you call Finish()) and add that
// duration to a microseconds clock.
//
class TimeSegmentAdder {
public:
TimeSegmentAdder(Microseconds &inTarget) :
target(inTarget),
startTime(std::chrono::steady_clock::now()),
finished(false) {
}
~TimeSegmentAdder() {
Finish();
}
// Call this to stop the timer and add the timed duration to `target`.
void Finish() {
if (!finished) {
const TimePoint endTime = std::chrono::steady_clock::now();
target += (std::chrono::duration_cast<std::chrono::microseconds>(endTime - startTime));
}
finished = true;
}
private:
// This is where we will add our duration to.
Microseconds &target;
// The time we started.
const TimePoint startTime;
// True when it has finished timing.
bool finished;
};
#endif // ZM_TIME_H #endif // ZM_TIME_H

View File

@ -23,6 +23,7 @@
#include "zm_config.h" #include "zm_config.h"
#include "zm_image.h" #include "zm_image.h"
#include "zm_monitor.h" #include "zm_monitor.h"
#include "zm_time.h"
#include "zm_utils.h" #include "zm_utils.h"
#include "zm_zone.h" #include "zm_zone.h"
@ -67,7 +68,7 @@ std::shared_ptr<Image> GenerateRandomImage(
// //
// This is used to help rig up tests of Monitor. // This is used to help rig up Monitor benchmarks.
// //
class TestMonitor : public Monitor class TestMonitor : public Monitor
{ {
@ -139,14 +140,14 @@ private:
class CounterInfo { class CounterInfo {
public: public:
CounterInfo( CounterInfo(
const std::chrono::microseconds &in_timer, const Microseconds in_timer,
const std::string &in_label) : const std::string &in_label) :
timer(in_timer), timer(in_timer),
label(in_label) label(in_label)
{ {
} }
const std::chrono::microseconds timer; const Microseconds timer;
const std::string label; const std::string label;
}; };
@ -158,7 +159,7 @@ public:
// //
void PrintCounters(std::vector<CounterInfo> counters) { void PrintCounters(std::vector<CounterInfo> counters) {
for (const auto counter : counters) { for (const auto counter : counters) {
printf("%s: %lims\n", counter.label.c_str(), counter.timer.count()); printf("%s: %liµs\n", counter.label.c_str(), counter.timer.count());
} }
} }
@ -181,23 +182,27 @@ void RunZoneBenchmark(const char *label, std::shared_ptr<Image> image) {
0, 0, image->Width(), image->Height()); 0, 0, image->Width(), image->Height());
testMonitor.SetRefImage(blackImage.get()); testMonitor.SetRefImage(blackImage.get());
std::chrono::microseconds totalTimeTaken(0); Microseconds totalTimeTaken(0);
printf("\n");
printf("------- %s -------\n", label);
// Run a series of passes over DetectMotion. // Run a series of passes over DetectMotion.
const int numPasses = 10; const int numPasses = 10;
for (int i=0; i < numPasses; i++) for (int i=0; i < numPasses; i++)
{ {
printf("\r(%d / %d) ", i+1, numPasses); printf("\rPass %2d / %2d ", i+1, numPasses);
fflush(stdout); fflush(stdout);
TimeSegmentAdder adder(totalTimeTaken);
Event::StringSet zoneSet; Event::StringSet zoneSet;
testMonitor.DetectMotion(*image.get(), zoneSet); testMonitor.DetectMotion(*image.get(), zoneSet);
} }
printf("\n"); printf("\n");
printf("------- %s -------\n", label);
PrintCounters({ PrintCounters({
CounterInfo(totalTimeTaken, "Total zone benchmark time")}); CounterInfo(totalTimeTaken / numPasses, "Time per pass")});
} }
@ -212,9 +217,9 @@ int main(int argc, char *argv[]) {
// Detect SSE version. // Detect SSE version.
HwCapsDetect(); HwCapsDetect();
RunZoneBenchmark("0%% delta", GenerateRandomImage(0, 0)); RunZoneBenchmark("0% delta", GenerateRandomImage(0, 0));
RunZoneBenchmark("50%% delta", GenerateRandomImage(0, 255)); RunZoneBenchmark("50% delta", GenerateRandomImage(0, 255));
RunZoneBenchmark("100%% delta", GenerateRandomImage(255, 255)); RunZoneBenchmark("100% delta", GenerateRandomImage(255, 255));
return 0; return 0;
} }