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*06f32e7eSjoerg void BM_basic(benchmark::State& state) {
11*06f32e7eSjoerg   for (auto _ : state) {
12*06f32e7eSjoerg   }
13*06f32e7eSjoerg }
14*06f32e7eSjoerg 
BM_basic_slow(benchmark::State & state)15*06f32e7eSjoerg void 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*06f32e7eSjoerg void 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*06f32e7eSjoerg void 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