-
-
Notifications
You must be signed in to change notification settings - Fork 991
/
benchmark.hpp
59 lines (50 loc) · 1.98 KB
/
benchmark.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#pragma once
#include "testing/testing.hpp"
#include "testing/testregister.hpp"
#include "base/timer.hpp"
#include <iostream>
namespace base
{
class BenchmarkNTimes
{
public:
BenchmarkNTimes(int repeatCount, double maxSecondsToSucceed)
: m_repeatCount(repeatCount), m_maxSecondsToSucceed(maxSecondsToSucceed), m_iteration(0)
{
}
~BenchmarkNTimes()
{
double const secondsElapsed = m_timer.ElapsedSeconds();
TEST_GREATER(m_repeatCount, 0, ());
TEST_LESS_OR_EQUAL(secondsElapsed, m_maxSecondsToSucceed, (m_repeatCount));
std::cout << secondsElapsed << "s total";
if (secondsElapsed > 0)
{
std::cout << ", " << static_cast<int>(m_repeatCount / secondsElapsed) << "/s, ";
/*
if (secondsElapsed / m_repeatCount * 1000 >= 10)
std::cout << static_cast<int>(secondsElapsed / m_repeatCount * 1000) << "ms each";
else */ if (secondsElapsed / m_repeatCount * 1000000 >= 10)
std::cout << static_cast<int>(secondsElapsed / m_repeatCount * 1000000) << "us each";
else
std::cout << static_cast<int>(secondsElapsed / m_repeatCount * 1000000000) << "ns each";
}
std::cout << " ...";
}
int Iteration() const { return m_iteration; }
bool ContinueIterating() const { return m_iteration < m_repeatCount; }
void NextIteration() { ++m_iteration; }
private:
int const m_repeatCount;
double const m_maxSecondsToSucceed;
int m_iteration;
Timer m_timer;
};
} // namespace base
#define BENCHMARK_TEST(name) \
void Benchmark_##name(); \
TestRegister g_BenchmarkRegister_##name("Benchmark::" #name, __FILE__, &Benchmark_##name); \
void Benchmark_##name()
#define BENCHMARK_N_TIMES(times, maxTimeToSucceed) \
for (::base::BenchmarkNTimes benchmark(times, maxTimeToSucceed); benchmark.ContinueIterating(); \
benchmark.NextIteration())