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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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 Trofinvoid 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