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