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