xref: /aosp_15_r20/external/google-benchmark/test/basic_test.cc (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
1*dbb99499SAndroid Build Coastguard Worker 
2*dbb99499SAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
3*dbb99499SAndroid Build Coastguard Worker 
4*dbb99499SAndroid Build Coastguard Worker #define BASIC_BENCHMARK_TEST(x) BENCHMARK(x)->Arg(8)->Arg(512)->Arg(8192)
5*dbb99499SAndroid Build Coastguard Worker 
BM_empty(benchmark::State & state)6*dbb99499SAndroid Build Coastguard Worker void BM_empty(benchmark::State& state) {
7*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
8*dbb99499SAndroid Build Coastguard Worker     auto iterations = double(state.iterations()) * double(state.iterations());
9*dbb99499SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(iterations);
10*dbb99499SAndroid Build Coastguard Worker   }
11*dbb99499SAndroid Build Coastguard Worker }
12*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_empty);
13*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_empty)->ThreadPerCpu();
14*dbb99499SAndroid Build Coastguard Worker 
BM_spin_empty(benchmark::State & state)15*dbb99499SAndroid Build Coastguard Worker void BM_spin_empty(benchmark::State& state) {
16*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
17*dbb99499SAndroid Build Coastguard Worker     for (auto x = 0; x < state.range(0); ++x) {
18*dbb99499SAndroid Build Coastguard Worker       benchmark::DoNotOptimize(x);
19*dbb99499SAndroid Build Coastguard Worker     }
20*dbb99499SAndroid Build Coastguard Worker   }
21*dbb99499SAndroid Build Coastguard Worker }
22*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_empty);
23*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_empty)->ThreadPerCpu();
24*dbb99499SAndroid Build Coastguard Worker 
BM_spin_pause_before(benchmark::State & state)25*dbb99499SAndroid Build Coastguard Worker void BM_spin_pause_before(benchmark::State& state) {
26*dbb99499SAndroid Build Coastguard Worker   for (auto i = 0; i < state.range(0); ++i) {
27*dbb99499SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(i);
28*dbb99499SAndroid Build Coastguard Worker   }
29*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
30*dbb99499SAndroid Build Coastguard Worker     for (auto i = 0; i < state.range(0); ++i) {
31*dbb99499SAndroid Build Coastguard Worker       benchmark::DoNotOptimize(i);
32*dbb99499SAndroid Build Coastguard Worker     }
33*dbb99499SAndroid Build Coastguard Worker   }
34*dbb99499SAndroid Build Coastguard Worker }
35*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_pause_before);
36*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_pause_before)->ThreadPerCpu();
37*dbb99499SAndroid Build Coastguard Worker 
BM_spin_pause_during(benchmark::State & state)38*dbb99499SAndroid Build Coastguard Worker void BM_spin_pause_during(benchmark::State& state) {
39*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
40*dbb99499SAndroid Build Coastguard Worker     state.PauseTiming();
41*dbb99499SAndroid Build Coastguard Worker     for (auto i = 0; i < state.range(0); ++i) {
42*dbb99499SAndroid Build Coastguard Worker       benchmark::DoNotOptimize(i);
43*dbb99499SAndroid Build Coastguard Worker     }
44*dbb99499SAndroid Build Coastguard Worker     state.ResumeTiming();
45*dbb99499SAndroid Build Coastguard Worker     for (auto i = 0; i < state.range(0); ++i) {
46*dbb99499SAndroid Build Coastguard Worker       benchmark::DoNotOptimize(i);
47*dbb99499SAndroid Build Coastguard Worker     }
48*dbb99499SAndroid Build Coastguard Worker   }
49*dbb99499SAndroid Build Coastguard Worker }
50*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_pause_during);
51*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_pause_during)->ThreadPerCpu();
52*dbb99499SAndroid Build Coastguard Worker 
BM_pause_during(benchmark::State & state)53*dbb99499SAndroid Build Coastguard Worker void BM_pause_during(benchmark::State& state) {
54*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
55*dbb99499SAndroid Build Coastguard Worker     state.PauseTiming();
56*dbb99499SAndroid Build Coastguard Worker     state.ResumeTiming();
57*dbb99499SAndroid Build Coastguard Worker   }
58*dbb99499SAndroid Build Coastguard Worker }
59*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_pause_during);
60*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_pause_during)->ThreadPerCpu();
61*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_pause_during)->UseRealTime();
62*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_pause_during)->UseRealTime()->ThreadPerCpu();
63*dbb99499SAndroid Build Coastguard Worker 
BM_spin_pause_after(benchmark::State & state)64*dbb99499SAndroid Build Coastguard Worker void BM_spin_pause_after(benchmark::State& state) {
65*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
66*dbb99499SAndroid Build Coastguard Worker     for (auto i = 0; i < state.range(0); ++i) {
67*dbb99499SAndroid Build Coastguard Worker       benchmark::DoNotOptimize(i);
68*dbb99499SAndroid Build Coastguard Worker     }
69*dbb99499SAndroid Build Coastguard Worker   }
70*dbb99499SAndroid Build Coastguard Worker   for (auto i = 0; i < state.range(0); ++i) {
71*dbb99499SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(i);
72*dbb99499SAndroid Build Coastguard Worker   }
73*dbb99499SAndroid Build Coastguard Worker }
74*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_pause_after);
75*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_pause_after)->ThreadPerCpu();
76*dbb99499SAndroid Build Coastguard Worker 
BM_spin_pause_before_and_after(benchmark::State & state)77*dbb99499SAndroid Build Coastguard Worker void BM_spin_pause_before_and_after(benchmark::State& state) {
78*dbb99499SAndroid Build Coastguard Worker   for (auto i = 0; i < state.range(0); ++i) {
79*dbb99499SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(i);
80*dbb99499SAndroid Build Coastguard Worker   }
81*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
82*dbb99499SAndroid Build Coastguard Worker     for (auto i = 0; i < state.range(0); ++i) {
83*dbb99499SAndroid Build Coastguard Worker       benchmark::DoNotOptimize(i);
84*dbb99499SAndroid Build Coastguard Worker     }
85*dbb99499SAndroid Build Coastguard Worker   }
86*dbb99499SAndroid Build Coastguard Worker   for (auto i = 0; i < state.range(0); ++i) {
87*dbb99499SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(i);
88*dbb99499SAndroid Build Coastguard Worker   }
89*dbb99499SAndroid Build Coastguard Worker }
90*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after);
91*dbb99499SAndroid Build Coastguard Worker BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after)->ThreadPerCpu();
92*dbb99499SAndroid Build Coastguard Worker 
BM_empty_stop_start(benchmark::State & state)93*dbb99499SAndroid Build Coastguard Worker void BM_empty_stop_start(benchmark::State& state) {
94*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
95*dbb99499SAndroid Build Coastguard Worker   }
96*dbb99499SAndroid Build Coastguard Worker }
97*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_empty_stop_start);
98*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_empty_stop_start)->ThreadPerCpu();
99*dbb99499SAndroid Build Coastguard Worker 
BM_KeepRunning(benchmark::State & state)100*dbb99499SAndroid Build Coastguard Worker void BM_KeepRunning(benchmark::State& state) {
101*dbb99499SAndroid Build Coastguard Worker   benchmark::IterationCount iter_count = 0;
102*dbb99499SAndroid Build Coastguard Worker   assert(iter_count == state.iterations());
103*dbb99499SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
104*dbb99499SAndroid Build Coastguard Worker     ++iter_count;
105*dbb99499SAndroid Build Coastguard Worker   }
106*dbb99499SAndroid Build Coastguard Worker   assert(iter_count == state.iterations());
107*dbb99499SAndroid Build Coastguard Worker }
108*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_KeepRunning);
109*dbb99499SAndroid Build Coastguard Worker 
BM_KeepRunningBatch(benchmark::State & state)110*dbb99499SAndroid Build Coastguard Worker void BM_KeepRunningBatch(benchmark::State& state) {
111*dbb99499SAndroid Build Coastguard Worker   // Choose a batch size >1000 to skip the typical runs with iteration
112*dbb99499SAndroid Build Coastguard Worker   // targets of 10, 100 and 1000.  If these are not actually skipped the
113*dbb99499SAndroid Build Coastguard Worker   // bug would be detectable as consecutive runs with the same iteration
114*dbb99499SAndroid Build Coastguard Worker   // count.  Below we assert that this does not happen.
115*dbb99499SAndroid Build Coastguard Worker   const benchmark::IterationCount batch_size = 1009;
116*dbb99499SAndroid Build Coastguard Worker 
117*dbb99499SAndroid Build Coastguard Worker   static benchmark::IterationCount prior_iter_count = 0;
118*dbb99499SAndroid Build Coastguard Worker   benchmark::IterationCount iter_count = 0;
119*dbb99499SAndroid Build Coastguard Worker   while (state.KeepRunningBatch(batch_size)) {
120*dbb99499SAndroid Build Coastguard Worker     iter_count += batch_size;
121*dbb99499SAndroid Build Coastguard Worker   }
122*dbb99499SAndroid Build Coastguard Worker   assert(state.iterations() == iter_count);
123*dbb99499SAndroid Build Coastguard Worker 
124*dbb99499SAndroid Build Coastguard Worker   // Verify that the iteration count always increases across runs (see
125*dbb99499SAndroid Build Coastguard Worker   // comment above).
126*dbb99499SAndroid Build Coastguard Worker   assert(iter_count == batch_size            // max_iterations == 1
127*dbb99499SAndroid Build Coastguard Worker          || iter_count > prior_iter_count);  // max_iterations > batch_size
128*dbb99499SAndroid Build Coastguard Worker   prior_iter_count = iter_count;
129*dbb99499SAndroid Build Coastguard Worker }
130*dbb99499SAndroid Build Coastguard Worker // Register with a fixed repetition count to establish the invariant that
131*dbb99499SAndroid Build Coastguard Worker // the iteration count should always change across runs.  This overrides
132*dbb99499SAndroid Build Coastguard Worker // the --benchmark_repetitions command line flag, which would otherwise
133*dbb99499SAndroid Build Coastguard Worker // cause this test to fail if set > 1.
134*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_KeepRunningBatch)->Repetitions(1);
135*dbb99499SAndroid Build Coastguard Worker 
BM_RangedFor(benchmark::State & state)136*dbb99499SAndroid Build Coastguard Worker void BM_RangedFor(benchmark::State& state) {
137*dbb99499SAndroid Build Coastguard Worker   benchmark::IterationCount iter_count = 0;
138*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
139*dbb99499SAndroid Build Coastguard Worker     ++iter_count;
140*dbb99499SAndroid Build Coastguard Worker   }
141*dbb99499SAndroid Build Coastguard Worker   assert(iter_count == state.max_iterations);
142*dbb99499SAndroid Build Coastguard Worker }
143*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_RangedFor);
144*dbb99499SAndroid Build Coastguard Worker 
145*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_HAS_CXX11
146*dbb99499SAndroid Build Coastguard Worker template <typename T>
BM_OneTemplateFunc(benchmark::State & state)147*dbb99499SAndroid Build Coastguard Worker void BM_OneTemplateFunc(benchmark::State& state) {
148*dbb99499SAndroid Build Coastguard Worker   auto arg = state.range(0);
149*dbb99499SAndroid Build Coastguard Worker   T sum = 0;
150*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
151*dbb99499SAndroid Build Coastguard Worker     sum += static_cast<T>(arg);
152*dbb99499SAndroid Build Coastguard Worker   }
153*dbb99499SAndroid Build Coastguard Worker }
154*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_OneTemplateFunc<int>)->Arg(1);
155*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_OneTemplateFunc<double>)->Arg(1);
156*dbb99499SAndroid Build Coastguard Worker 
157*dbb99499SAndroid Build Coastguard Worker template <typename A, typename B>
BM_TwoTemplateFunc(benchmark::State & state)158*dbb99499SAndroid Build Coastguard Worker void BM_TwoTemplateFunc(benchmark::State& state) {
159*dbb99499SAndroid Build Coastguard Worker   auto arg = state.range(0);
160*dbb99499SAndroid Build Coastguard Worker   A sum = 0;
161*dbb99499SAndroid Build Coastguard Worker   B prod = 1;
162*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
163*dbb99499SAndroid Build Coastguard Worker     sum += static_cast<A>(arg);
164*dbb99499SAndroid Build Coastguard Worker     prod *= static_cast<B>(arg);
165*dbb99499SAndroid Build Coastguard Worker   }
166*dbb99499SAndroid Build Coastguard Worker }
167*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_TwoTemplateFunc<int, double>)->Arg(1);
168*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_TwoTemplateFunc<double, int>)->Arg(1);
169*dbb99499SAndroid Build Coastguard Worker 
170*dbb99499SAndroid Build Coastguard Worker #endif  // BENCHMARK_HAS_CXX11
171*dbb99499SAndroid Build Coastguard Worker 
172*dbb99499SAndroid Build Coastguard Worker // Ensure that StateIterator provides all the necessary typedefs required to
173*dbb99499SAndroid Build Coastguard Worker // instantiate std::iterator_traits.
174*dbb99499SAndroid Build Coastguard Worker static_assert(
175*dbb99499SAndroid Build Coastguard Worker     std::is_same<typename std::iterator_traits<
176*dbb99499SAndroid Build Coastguard Worker                      benchmark::State::StateIterator>::value_type,
177*dbb99499SAndroid Build Coastguard Worker                  typename benchmark::State::StateIterator::value_type>::value,
178*dbb99499SAndroid Build Coastguard Worker     "");
179*dbb99499SAndroid Build Coastguard Worker 
180*dbb99499SAndroid Build Coastguard Worker BENCHMARK_MAIN();
181