1*06f32e7eSjoerg #include "benchmark/benchmark.h" 2*06f32e7eSjoerg #include <chrono> 3*06f32e7eSjoerg #include <thread> 4*06f32e7eSjoerg 5*06f32e7eSjoerg #if defined(NDEBUG) 6*06f32e7eSjoerg #undef NDEBUG 7*06f32e7eSjoerg #endif 8*06f32e7eSjoerg #include <cassert> 9*06f32e7eSjoerg BM_basic(benchmark::State & state)10*06f32e7eSjoergvoid BM_basic(benchmark::State& state) { 11*06f32e7eSjoerg for (auto _ : state) { 12*06f32e7eSjoerg } 13*06f32e7eSjoerg } 14*06f32e7eSjoerg BM_basic_slow(benchmark::State & state)15*06f32e7eSjoergvoid BM_basic_slow(benchmark::State& state) { 16*06f32e7eSjoerg std::chrono::milliseconds sleep_duration(state.range(0)); 17*06f32e7eSjoerg for (auto _ : state) { 18*06f32e7eSjoerg std::this_thread::sleep_for( 19*06f32e7eSjoerg std::chrono::duration_cast<std::chrono::nanoseconds>(sleep_duration)); 20*06f32e7eSjoerg } 21*06f32e7eSjoerg } 22*06f32e7eSjoerg 23*06f32e7eSjoerg BENCHMARK(BM_basic); 24*06f32e7eSjoerg BENCHMARK(BM_basic)->Arg(42); 25*06f32e7eSjoerg BENCHMARK(BM_basic_slow)->Arg(10)->Unit(benchmark::kNanosecond); 26*06f32e7eSjoerg BENCHMARK(BM_basic_slow)->Arg(100)->Unit(benchmark::kMicrosecond); 27*06f32e7eSjoerg BENCHMARK(BM_basic_slow)->Arg(1000)->Unit(benchmark::kMillisecond); 28*06f32e7eSjoerg BENCHMARK(BM_basic)->Range(1, 8); 29*06f32e7eSjoerg BENCHMARK(BM_basic)->RangeMultiplier(2)->Range(1, 8); 30*06f32e7eSjoerg BENCHMARK(BM_basic)->DenseRange(10, 15); 31*06f32e7eSjoerg BENCHMARK(BM_basic)->Args({42, 42}); 32*06f32e7eSjoerg BENCHMARK(BM_basic)->Ranges({{64, 512}, {64, 512}}); 33*06f32e7eSjoerg BENCHMARK(BM_basic)->MinTime(0.7); 34*06f32e7eSjoerg BENCHMARK(BM_basic)->UseRealTime(); 35*06f32e7eSjoerg BENCHMARK(BM_basic)->ThreadRange(2, 4); 36*06f32e7eSjoerg BENCHMARK(BM_basic)->ThreadPerCpu(); 37*06f32e7eSjoerg BENCHMARK(BM_basic)->Repetitions(3); 38*06f32e7eSjoerg CustomArgs(benchmark::internal::Benchmark * b)39*06f32e7eSjoergvoid CustomArgs(benchmark::internal::Benchmark* b) { 40*06f32e7eSjoerg for (int i = 0; i < 10; ++i) { 41*06f32e7eSjoerg b->Arg(i); 42*06f32e7eSjoerg } 43*06f32e7eSjoerg } 44*06f32e7eSjoerg 45*06f32e7eSjoerg BENCHMARK(BM_basic)->Apply(CustomArgs); 46*06f32e7eSjoerg BM_explicit_iteration_count(benchmark::State & state)47*06f32e7eSjoergvoid BM_explicit_iteration_count(benchmark::State& state) { 48*06f32e7eSjoerg // Test that benchmarks specified with an explicit iteration count are 49*06f32e7eSjoerg // only run once. 50*06f32e7eSjoerg static bool invoked_before = false; 51*06f32e7eSjoerg assert(!invoked_before); 52*06f32e7eSjoerg invoked_before = true; 53*06f32e7eSjoerg 54*06f32e7eSjoerg // Test that the requested iteration count is respected. 55*06f32e7eSjoerg assert(state.max_iterations == 42); 56*06f32e7eSjoerg size_t actual_iterations = 0; 57*06f32e7eSjoerg for (auto _ : state) 58*06f32e7eSjoerg ++actual_iterations; 59*06f32e7eSjoerg assert(state.iterations() == state.max_iterations); 60*06f32e7eSjoerg assert(state.iterations() == 42); 61*06f32e7eSjoerg 62*06f32e7eSjoerg } 63*06f32e7eSjoerg BENCHMARK(BM_explicit_iteration_count)->Iterations(42); 64*06f32e7eSjoerg 65*06f32e7eSjoerg BENCHMARK_MAIN(); 66