xref: /llvm-project/third-party/benchmark/test/basic_test.cc (revision a5b797172cc902db166e9a695716fb81405f86e4)
15dda2efdSMircea Trofin 
25dda2efdSMircea Trofin #include "benchmark/benchmark.h"
35dda2efdSMircea Trofin 
45dda2efdSMircea Trofin #define BASIC_BENCHMARK_TEST(x) BENCHMARK(x)->Arg(8)->Arg(512)->Arg(8192)
55dda2efdSMircea Trofin 
BM_empty(benchmark::State & state)65dda2efdSMircea Trofin void BM_empty(benchmark::State& state) {
75dda2efdSMircea Trofin   for (auto _ : state) {
8*a5b79717SMircea Trofin     auto iterations = double(state.iterations()) * double(state.iterations());
9*a5b79717SMircea Trofin     benchmark::DoNotOptimize(iterations);
105dda2efdSMircea Trofin   }
115dda2efdSMircea Trofin }
125dda2efdSMircea Trofin BENCHMARK(BM_empty);
135dda2efdSMircea Trofin BENCHMARK(BM_empty)->ThreadPerCpu();
145dda2efdSMircea Trofin 
BM_spin_empty(benchmark::State & state)155dda2efdSMircea Trofin void BM_spin_empty(benchmark::State& state) {
165dda2efdSMircea Trofin   for (auto _ : state) {
17a290770fSMircea Trofin     for (auto x = 0; x < state.range(0); ++x) {
185dda2efdSMircea Trofin       benchmark::DoNotOptimize(x);
195dda2efdSMircea Trofin     }
205dda2efdSMircea Trofin   }
215dda2efdSMircea Trofin }
225dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_empty);
235dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_empty)->ThreadPerCpu();
245dda2efdSMircea Trofin 
BM_spin_pause_before(benchmark::State & state)255dda2efdSMircea Trofin void BM_spin_pause_before(benchmark::State& state) {
26a290770fSMircea Trofin   for (auto i = 0; i < state.range(0); ++i) {
275dda2efdSMircea Trofin     benchmark::DoNotOptimize(i);
285dda2efdSMircea Trofin   }
295dda2efdSMircea Trofin   for (auto _ : state) {
30a290770fSMircea Trofin     for (auto i = 0; i < state.range(0); ++i) {
315dda2efdSMircea Trofin       benchmark::DoNotOptimize(i);
325dda2efdSMircea Trofin     }
335dda2efdSMircea Trofin   }
345dda2efdSMircea Trofin }
355dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_pause_before);
365dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_pause_before)->ThreadPerCpu();
375dda2efdSMircea Trofin 
BM_spin_pause_during(benchmark::State & state)385dda2efdSMircea Trofin void BM_spin_pause_during(benchmark::State& state) {
395dda2efdSMircea Trofin   for (auto _ : state) {
405dda2efdSMircea Trofin     state.PauseTiming();
41a290770fSMircea Trofin     for (auto i = 0; i < state.range(0); ++i) {
425dda2efdSMircea Trofin       benchmark::DoNotOptimize(i);
435dda2efdSMircea Trofin     }
445dda2efdSMircea Trofin     state.ResumeTiming();
45a290770fSMircea Trofin     for (auto i = 0; i < state.range(0); ++i) {
465dda2efdSMircea Trofin       benchmark::DoNotOptimize(i);
475dda2efdSMircea Trofin     }
485dda2efdSMircea Trofin   }
495dda2efdSMircea Trofin }
505dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_pause_during);
515dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_pause_during)->ThreadPerCpu();
525dda2efdSMircea Trofin 
BM_pause_during(benchmark::State & state)535dda2efdSMircea Trofin void BM_pause_during(benchmark::State& state) {
545dda2efdSMircea Trofin   for (auto _ : state) {
555dda2efdSMircea Trofin     state.PauseTiming();
565dda2efdSMircea Trofin     state.ResumeTiming();
575dda2efdSMircea Trofin   }
585dda2efdSMircea Trofin }
595dda2efdSMircea Trofin BENCHMARK(BM_pause_during);
605dda2efdSMircea Trofin BENCHMARK(BM_pause_during)->ThreadPerCpu();
615dda2efdSMircea Trofin BENCHMARK(BM_pause_during)->UseRealTime();
625dda2efdSMircea Trofin BENCHMARK(BM_pause_during)->UseRealTime()->ThreadPerCpu();
635dda2efdSMircea Trofin 
BM_spin_pause_after(benchmark::State & state)645dda2efdSMircea Trofin void BM_spin_pause_after(benchmark::State& state) {
655dda2efdSMircea Trofin   for (auto _ : state) {
66a290770fSMircea Trofin     for (auto i = 0; i < state.range(0); ++i) {
675dda2efdSMircea Trofin       benchmark::DoNotOptimize(i);
685dda2efdSMircea Trofin     }
695dda2efdSMircea Trofin   }
70a290770fSMircea Trofin   for (auto i = 0; i < state.range(0); ++i) {
715dda2efdSMircea Trofin     benchmark::DoNotOptimize(i);
725dda2efdSMircea Trofin   }
735dda2efdSMircea Trofin }
745dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_pause_after);
755dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_pause_after)->ThreadPerCpu();
765dda2efdSMircea Trofin 
BM_spin_pause_before_and_after(benchmark::State & state)775dda2efdSMircea Trofin void BM_spin_pause_before_and_after(benchmark::State& state) {
78a290770fSMircea Trofin   for (auto i = 0; i < state.range(0); ++i) {
795dda2efdSMircea Trofin     benchmark::DoNotOptimize(i);
805dda2efdSMircea Trofin   }
815dda2efdSMircea Trofin   for (auto _ : state) {
82a290770fSMircea Trofin     for (auto i = 0; i < state.range(0); ++i) {
835dda2efdSMircea Trofin       benchmark::DoNotOptimize(i);
845dda2efdSMircea Trofin     }
855dda2efdSMircea Trofin   }
86a290770fSMircea Trofin   for (auto i = 0; i < state.range(0); ++i) {
875dda2efdSMircea Trofin     benchmark::DoNotOptimize(i);
885dda2efdSMircea Trofin   }
895dda2efdSMircea Trofin }
905dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after);
915dda2efdSMircea Trofin BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after)->ThreadPerCpu();
925dda2efdSMircea Trofin 
BM_empty_stop_start(benchmark::State & state)935dda2efdSMircea Trofin void BM_empty_stop_start(benchmark::State& state) {
945dda2efdSMircea Trofin   for (auto _ : state) {
955dda2efdSMircea Trofin   }
965dda2efdSMircea Trofin }
975dda2efdSMircea Trofin BENCHMARK(BM_empty_stop_start);
985dda2efdSMircea Trofin BENCHMARK(BM_empty_stop_start)->ThreadPerCpu();
995dda2efdSMircea Trofin 
BM_KeepRunning(benchmark::State & state)1005dda2efdSMircea Trofin void BM_KeepRunning(benchmark::State& state) {
1015dda2efdSMircea Trofin   benchmark::IterationCount iter_count = 0;
1025dda2efdSMircea Trofin   assert(iter_count == state.iterations());
1035dda2efdSMircea Trofin   while (state.KeepRunning()) {
1045dda2efdSMircea Trofin     ++iter_count;
1055dda2efdSMircea Trofin   }
1065dda2efdSMircea Trofin   assert(iter_count == state.iterations());
1075dda2efdSMircea Trofin }
1085dda2efdSMircea Trofin BENCHMARK(BM_KeepRunning);
1095dda2efdSMircea Trofin 
BM_KeepRunningBatch(benchmark::State & state)1105dda2efdSMircea Trofin void BM_KeepRunningBatch(benchmark::State& state) {
1115dda2efdSMircea Trofin   // Choose a batch size >1000 to skip the typical runs with iteration
1125dda2efdSMircea Trofin   // targets of 10, 100 and 1000.  If these are not actually skipped the
1135dda2efdSMircea Trofin   // bug would be detectable as consecutive runs with the same iteration
1145dda2efdSMircea Trofin   // count.  Below we assert that this does not happen.
1155dda2efdSMircea Trofin   const benchmark::IterationCount batch_size = 1009;
1165dda2efdSMircea Trofin 
1175dda2efdSMircea Trofin   static benchmark::IterationCount prior_iter_count = 0;
1185dda2efdSMircea Trofin   benchmark::IterationCount iter_count = 0;
1195dda2efdSMircea Trofin   while (state.KeepRunningBatch(batch_size)) {
1205dda2efdSMircea Trofin     iter_count += batch_size;
1215dda2efdSMircea Trofin   }
1225dda2efdSMircea Trofin   assert(state.iterations() == iter_count);
1235dda2efdSMircea Trofin 
1245dda2efdSMircea Trofin   // Verify that the iteration count always increases across runs (see
1255dda2efdSMircea Trofin   // comment above).
1265dda2efdSMircea Trofin   assert(iter_count == batch_size            // max_iterations == 1
1275dda2efdSMircea Trofin          || iter_count > prior_iter_count);  // max_iterations > batch_size
1285dda2efdSMircea Trofin   prior_iter_count = iter_count;
1295dda2efdSMircea Trofin }
1305dda2efdSMircea Trofin // Register with a fixed repetition count to establish the invariant that
1315dda2efdSMircea Trofin // the iteration count should always change across runs.  This overrides
1325dda2efdSMircea Trofin // the --benchmark_repetitions command line flag, which would otherwise
1335dda2efdSMircea Trofin // cause this test to fail if set > 1.
1345dda2efdSMircea Trofin BENCHMARK(BM_KeepRunningBatch)->Repetitions(1);
1355dda2efdSMircea Trofin 
BM_RangedFor(benchmark::State & state)1365dda2efdSMircea Trofin void BM_RangedFor(benchmark::State& state) {
1375dda2efdSMircea Trofin   benchmark::IterationCount iter_count = 0;
1385dda2efdSMircea Trofin   for (auto _ : state) {
1395dda2efdSMircea Trofin     ++iter_count;
1405dda2efdSMircea Trofin   }
1415dda2efdSMircea Trofin   assert(iter_count == state.max_iterations);
1425dda2efdSMircea Trofin }
1435dda2efdSMircea Trofin BENCHMARK(BM_RangedFor);
1445dda2efdSMircea Trofin 
145a290770fSMircea Trofin #ifdef BENCHMARK_HAS_CXX11
146a290770fSMircea Trofin template <typename T>
BM_OneTemplateFunc(benchmark::State & state)147a290770fSMircea Trofin void BM_OneTemplateFunc(benchmark::State& state) {
148a290770fSMircea Trofin   auto arg = state.range(0);
149a290770fSMircea Trofin   T sum = 0;
150a290770fSMircea Trofin   for (auto _ : state) {
151*a5b79717SMircea Trofin     sum += static_cast<T>(arg);
152a290770fSMircea Trofin   }
153a290770fSMircea Trofin }
154a290770fSMircea Trofin BENCHMARK(BM_OneTemplateFunc<int>)->Arg(1);
155a290770fSMircea Trofin BENCHMARK(BM_OneTemplateFunc<double>)->Arg(1);
156a290770fSMircea Trofin 
157a290770fSMircea Trofin template <typename A, typename B>
BM_TwoTemplateFunc(benchmark::State & state)158a290770fSMircea Trofin void BM_TwoTemplateFunc(benchmark::State& state) {
159a290770fSMircea Trofin   auto arg = state.range(0);
160a290770fSMircea Trofin   A sum = 0;
161a290770fSMircea Trofin   B prod = 1;
162a290770fSMircea Trofin   for (auto _ : state) {
163*a5b79717SMircea Trofin     sum += static_cast<A>(arg);
164*a5b79717SMircea Trofin     prod *= static_cast<B>(arg);
165a290770fSMircea Trofin   }
166a290770fSMircea Trofin }
167a290770fSMircea Trofin BENCHMARK(BM_TwoTemplateFunc<int, double>)->Arg(1);
168a290770fSMircea Trofin BENCHMARK(BM_TwoTemplateFunc<double, int>)->Arg(1);
169a290770fSMircea Trofin 
170a290770fSMircea Trofin #endif  // BENCHMARK_HAS_CXX11
171a290770fSMircea Trofin 
1725dda2efdSMircea Trofin // Ensure that StateIterator provides all the necessary typedefs required to
1735dda2efdSMircea Trofin // instantiate std::iterator_traits.
174a290770fSMircea Trofin static_assert(
175a290770fSMircea Trofin     std::is_same<typename std::iterator_traits<
176a290770fSMircea Trofin                      benchmark::State::StateIterator>::value_type,
177a290770fSMircea Trofin                  typename benchmark::State::StateIterator::value_type>::value,
178a290770fSMircea Trofin     "");
1795dda2efdSMircea Trofin 
1805dda2efdSMircea Trofin BENCHMARK_MAIN();
181