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