17#define ZEROERR_CREATE_BENCHMARK_FUNC(function, name, ...) \
18 static void function(zeroerr::TestContext*); \
19 static zeroerr::detail::regTest ZEROERR_NAMEGEN(_zeroerr_reg)( \
20 {name, __FILE__, __LINE__, function, {__VA_ARGS__}}, zeroerr::TestType::bench); \
21 static void function(ZEROERR_UNUSED(zeroerr::TestContext* _ZEROERR_TEST_CONTEXT))
23#define BENCHMARK(name, ...) \
24 ZEROERR_CREATE_BENCHMARK_FUNC(ZEROERR_NAMEGEN(_zeroerr_benchmark), name, __VA_ARGS__)
46using Clock = std::conditional<std::chrono::high_resolution_clock::is_steady,
47 std::chrono::high_resolution_clock, std::chrono::steady_clock>::type;
50struct LinuxPerformanceCounter;
51struct WindowsPerformanceCounter;
77 detail::LinuxPerformanceCounter*
_perf =
nullptr;
78 detail::WindowsPerformanceCounter*
win_perf =
nullptr;
129 using ns = std::chrono::nanoseconds;
130 using ms = std::chrono::milliseconds;
141 template <
typename Op>
147 while (n-- > 0) op();
155 template <
typename Op>
157 return run(
"", std::forward<Op>(op));
168void doNotOptimizeAwaySink(
const void*);
172 doNotOptimizeAwaySink(&val);
184 asm volatile(
"" : :
"r,m"(val) :
"memory");
189#if defined(__clang__)
191 asm volatile(
"" :
"+r,m"(val) : :
"memory");
194 asm volatile(
"" :
"+m,r"(val) : :
"memory");
208template <
typename Arg>
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_POP
Definition config.h:265
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_PUSH
Definition config.h:218
void doNotOptimizeAway(const T &val)
Definition benchmark.h:182
Definition benchmark.cpp:17
void doNotOptimizeAway(Arg &&arg)
Makes sure none of the given arguments are optimized away by the compiler.
Definition benchmark.h:209
void destroyBenchState(BenchState *state)
Definition benchmark.cpp:152
void moveResult(BenchState *state, std::string name)
Definition benchmark.cpp:179
BenchState * createBenchState(Benchmark &benchmark)
Definition benchmark.cpp:151
void runIteration(BenchState *state)
Definition benchmark.cpp:159
std::conditional< std::chrono::high_resolution_clock::is_steady, std::chrono::high_resolution_clock, std::chrono::steady_clock >::type Clock
Definition benchmark.h:47
size_t getNumIter(BenchState *state)
Definition benchmark.cpp:154
BenchResult is a result of running the benchmark.
Definition benchmark.h:84
Measure
Definition benchmark.h:85
@ all
Definition benchmark.h:94
@ iterations
Definition benchmark.h:87
@ branch_misses
Definition benchmark.h:93
@ context_switches
Definition benchmark.h:90
@ instructions
Definition benchmark.h:91
@ time_elapsed
Definition benchmark.h:86
@ branch_instructions
Definition benchmark.h:92
@ cpu_cycles
Definition benchmark.h:89
@ page_faults
Definition benchmark.h:88
PerfCountSet< double > mean() const
Definition benchmark.cpp:229
PerfCountSet< double > average() const
Definition benchmark.cpp:189
PerfCountSet< double > max() const
Definition benchmark.cpp:216
PerfCountSet< double > min() const
Definition benchmark.cpp:203
std::string name
Definition benchmark.h:96
PerfCountSet< bool > has
Definition benchmark.h:98
std::vector< PerfCountSet< double > > epoch_details
Definition benchmark.h:97
Definition benchmark.cpp:50
Benchmark create a core object for configuration of a benchmark. This class is a driver to run multip...
Definition benchmark.h:121
uint64_t iter_per_epoch
Definition benchmark.h:127
std::chrono::milliseconds ms
Definition benchmark.h:130
const char * time_unit
Definition benchmark.h:124
Benchmark & run(std::string name, Op &&op)
Definition benchmark.h:142
std::vector< BenchResult > result
Definition benchmark.h:160
uint64_t warmup
Definition benchmark.h:126
uint64_t minimalResolutionMutipler
Definition benchmark.h:136
Benchmark & run(Op &&op)
Definition benchmark.h:156
time mMaxEpochTime
Definition benchmark.h:133
std::chrono::nanoseconds ns
Definition benchmark.h:129
ns time
Definition benchmark.h:131
time mMinEpochTime
Definition benchmark.h:134
Benchmark(std::string title)
Definition benchmark.h:138
uint64_t epochs
Definition benchmark.h:125
void report()
Definition benchmark.cpp:235
std::string title
Definition benchmark.h:122
const char * op_unit
Definition benchmark.h:123
PerfCountSet is a set of performance counters.
Definition benchmark.h:33
T iterations
Definition benchmark.h:34
T & timeElapsed()
Definition benchmark.h:37
T & branchInstructions()
Definition benchmark.h:42
T & pageFaults()
Definition benchmark.h:38
T & cpuCycles()
Definition benchmark.h:39
T data[7]
Definition benchmark.h:35
T & contextSwitches()
Definition benchmark.h:40
T & branchMisses()
Definition benchmark.h:43
T & instructions()
Definition benchmark.h:41