xref: /netbsd-src/external/apache2/llvm/dist/libcxx/utils/google-benchmark/test/basic_test.cc (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg 
2*4d6fc14bSjoerg #include "benchmark/benchmark.h"
3*4d6fc14bSjoerg 
4*4d6fc14bSjoerg #define BASIC_BENCHMARK_TEST(x) BENCHMARK(x)->Arg(8)->Arg(512)->Arg(8192)
5*4d6fc14bSjoerg 
BM_empty(benchmark::State & state)6*4d6fc14bSjoerg void BM_empty(benchmark::State& state) {
7*4d6fc14bSjoerg   for (auto _ : state) {
8*4d6fc14bSjoerg     benchmark::DoNotOptimize(state.iterations());
9*4d6fc14bSjoerg   }
10*4d6fc14bSjoerg }
11*4d6fc14bSjoerg BENCHMARK(BM_empty);
12*4d6fc14bSjoerg BENCHMARK(BM_empty)->ThreadPerCpu();
13*4d6fc14bSjoerg 
BM_spin_empty(benchmark::State & state)14*4d6fc14bSjoerg void BM_spin_empty(benchmark::State& state) {
15*4d6fc14bSjoerg   for (auto _ : state) {
16*4d6fc14bSjoerg     for (int x = 0; x < state.range(0); ++x) {
17*4d6fc14bSjoerg       benchmark::DoNotOptimize(x);
18*4d6fc14bSjoerg     }
19*4d6fc14bSjoerg   }
20*4d6fc14bSjoerg }
21*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_empty);
22*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_empty)->ThreadPerCpu();
23*4d6fc14bSjoerg 
BM_spin_pause_before(benchmark::State & state)24*4d6fc14bSjoerg void BM_spin_pause_before(benchmark::State& state) {
25*4d6fc14bSjoerg   for (int i = 0; i < state.range(0); ++i) {
26*4d6fc14bSjoerg     benchmark::DoNotOptimize(i);
27*4d6fc14bSjoerg   }
28*4d6fc14bSjoerg   for (auto _ : state) {
29*4d6fc14bSjoerg     for (int i = 0; i < state.range(0); ++i) {
30*4d6fc14bSjoerg       benchmark::DoNotOptimize(i);
31*4d6fc14bSjoerg     }
32*4d6fc14bSjoerg   }
33*4d6fc14bSjoerg }
34*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_pause_before);
35*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_pause_before)->ThreadPerCpu();
36*4d6fc14bSjoerg 
BM_spin_pause_during(benchmark::State & state)37*4d6fc14bSjoerg void BM_spin_pause_during(benchmark::State& state) {
38*4d6fc14bSjoerg   for (auto _ : state) {
39*4d6fc14bSjoerg     state.PauseTiming();
40*4d6fc14bSjoerg     for (int i = 0; i < state.range(0); ++i) {
41*4d6fc14bSjoerg       benchmark::DoNotOptimize(i);
42*4d6fc14bSjoerg     }
43*4d6fc14bSjoerg     state.ResumeTiming();
44*4d6fc14bSjoerg     for (int i = 0; i < state.range(0); ++i) {
45*4d6fc14bSjoerg       benchmark::DoNotOptimize(i);
46*4d6fc14bSjoerg     }
47*4d6fc14bSjoerg   }
48*4d6fc14bSjoerg }
49*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_pause_during);
50*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_pause_during)->ThreadPerCpu();
51*4d6fc14bSjoerg 
BM_pause_during(benchmark::State & state)52*4d6fc14bSjoerg void BM_pause_during(benchmark::State& state) {
53*4d6fc14bSjoerg   for (auto _ : state) {
54*4d6fc14bSjoerg     state.PauseTiming();
55*4d6fc14bSjoerg     state.ResumeTiming();
56*4d6fc14bSjoerg   }
57*4d6fc14bSjoerg }
58*4d6fc14bSjoerg BENCHMARK(BM_pause_during);
59*4d6fc14bSjoerg BENCHMARK(BM_pause_during)->ThreadPerCpu();
60*4d6fc14bSjoerg BENCHMARK(BM_pause_during)->UseRealTime();
61*4d6fc14bSjoerg BENCHMARK(BM_pause_during)->UseRealTime()->ThreadPerCpu();
62*4d6fc14bSjoerg 
BM_spin_pause_after(benchmark::State & state)63*4d6fc14bSjoerg void BM_spin_pause_after(benchmark::State& state) {
64*4d6fc14bSjoerg   for (auto _ : state) {
65*4d6fc14bSjoerg     for (int i = 0; i < state.range(0); ++i) {
66*4d6fc14bSjoerg       benchmark::DoNotOptimize(i);
67*4d6fc14bSjoerg     }
68*4d6fc14bSjoerg   }
69*4d6fc14bSjoerg   for (int i = 0; i < state.range(0); ++i) {
70*4d6fc14bSjoerg     benchmark::DoNotOptimize(i);
71*4d6fc14bSjoerg   }
72*4d6fc14bSjoerg }
73*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_pause_after);
74*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_pause_after)->ThreadPerCpu();
75*4d6fc14bSjoerg 
BM_spin_pause_before_and_after(benchmark::State & state)76*4d6fc14bSjoerg void BM_spin_pause_before_and_after(benchmark::State& state) {
77*4d6fc14bSjoerg   for (int i = 0; i < state.range(0); ++i) {
78*4d6fc14bSjoerg     benchmark::DoNotOptimize(i);
79*4d6fc14bSjoerg   }
80*4d6fc14bSjoerg   for (auto _ : state) {
81*4d6fc14bSjoerg     for (int i = 0; i < state.range(0); ++i) {
82*4d6fc14bSjoerg       benchmark::DoNotOptimize(i);
83*4d6fc14bSjoerg     }
84*4d6fc14bSjoerg   }
85*4d6fc14bSjoerg   for (int i = 0; i < state.range(0); ++i) {
86*4d6fc14bSjoerg     benchmark::DoNotOptimize(i);
87*4d6fc14bSjoerg   }
88*4d6fc14bSjoerg }
89*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after);
90*4d6fc14bSjoerg BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after)->ThreadPerCpu();
91*4d6fc14bSjoerg 
BM_empty_stop_start(benchmark::State & state)92*4d6fc14bSjoerg void BM_empty_stop_start(benchmark::State& state) {
93*4d6fc14bSjoerg   for (auto _ : state) {
94*4d6fc14bSjoerg   }
95*4d6fc14bSjoerg }
96*4d6fc14bSjoerg BENCHMARK(BM_empty_stop_start);
97*4d6fc14bSjoerg BENCHMARK(BM_empty_stop_start)->ThreadPerCpu();
98*4d6fc14bSjoerg 
99*4d6fc14bSjoerg 
BM_KeepRunning(benchmark::State & state)100*4d6fc14bSjoerg void BM_KeepRunning(benchmark::State& state) {
101*4d6fc14bSjoerg   size_t iter_count = 0;
102*4d6fc14bSjoerg   assert(iter_count == state.iterations());
103*4d6fc14bSjoerg   while (state.KeepRunning()) {
104*4d6fc14bSjoerg     ++iter_count;
105*4d6fc14bSjoerg   }
106*4d6fc14bSjoerg   assert(iter_count == state.iterations());
107*4d6fc14bSjoerg }
108*4d6fc14bSjoerg BENCHMARK(BM_KeepRunning);
109*4d6fc14bSjoerg 
BM_KeepRunningBatch(benchmark::State & state)110*4d6fc14bSjoerg void BM_KeepRunningBatch(benchmark::State& state) {
111*4d6fc14bSjoerg   // Choose a prime batch size to avoid evenly dividing max_iterations.
112*4d6fc14bSjoerg   const size_t batch_size = 101;
113*4d6fc14bSjoerg   size_t iter_count = 0;
114*4d6fc14bSjoerg   while (state.KeepRunningBatch(batch_size)) {
115*4d6fc14bSjoerg     iter_count += batch_size;
116*4d6fc14bSjoerg   }
117*4d6fc14bSjoerg   assert(state.iterations() == iter_count);
118*4d6fc14bSjoerg }
119*4d6fc14bSjoerg BENCHMARK(BM_KeepRunningBatch);
120*4d6fc14bSjoerg 
BM_RangedFor(benchmark::State & state)121*4d6fc14bSjoerg void BM_RangedFor(benchmark::State& state) {
122*4d6fc14bSjoerg   size_t iter_count = 0;
123*4d6fc14bSjoerg   for (auto _ : state) {
124*4d6fc14bSjoerg     ++iter_count;
125*4d6fc14bSjoerg   }
126*4d6fc14bSjoerg   assert(iter_count == state.max_iterations);
127*4d6fc14bSjoerg }
128*4d6fc14bSjoerg BENCHMARK(BM_RangedFor);
129*4d6fc14bSjoerg 
130*4d6fc14bSjoerg // Ensure that StateIterator provides all the necessary typedefs required to
131*4d6fc14bSjoerg // instantiate std::iterator_traits.
132*4d6fc14bSjoerg static_assert(std::is_same<
133*4d6fc14bSjoerg   typename std::iterator_traits<benchmark::State::StateIterator>::value_type,
134*4d6fc14bSjoerg   typename benchmark::State::StateIterator::value_type>::value, "");
135*4d6fc14bSjoerg 
136*4d6fc14bSjoerg BENCHMARK_MAIN();
137