blob: d07fbc00b15160bcad644a5d3de56a9d11dd0d5b [file] [log] [blame]
Eric Fiselierb08d8b12016-07-19 23:07:03 +00001
Eric Fiselier19039762018-01-18 04:23:01 +00002#include "benchmark/benchmark.h"
Eric Fiselierb08d8b12016-07-19 23:07:03 +00003
Eric Fiselierfbc9ff22016-11-05 00:30:27 +00004#define BASIC_BENCHMARK_TEST(x) BENCHMARK(x)->Arg(8)->Arg(512)->Arg(8192)
Eric Fiselierb08d8b12016-07-19 23:07:03 +00005
6void BM_empty(benchmark::State& state) {
Eric Fiselier19039762018-01-18 04:23:01 +00007 for (auto _ : state) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +00008 benchmark::DoNotOptimize(state.iterations());
9 }
10}
11BENCHMARK(BM_empty);
12BENCHMARK(BM_empty)->ThreadPerCpu();
13
14void BM_spin_empty(benchmark::State& state) {
Eric Fiselier19039762018-01-18 04:23:01 +000015 for (auto _ : state) {
Eric Fiselierf6e09e52016-08-09 18:56:48 +000016 for (int x = 0; x < state.range(0); ++x) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000017 benchmark::DoNotOptimize(x);
18 }
19 }
20}
21BASIC_BENCHMARK_TEST(BM_spin_empty);
22BASIC_BENCHMARK_TEST(BM_spin_empty)->ThreadPerCpu();
23
24void BM_spin_pause_before(benchmark::State& state) {
Eric Fiselierf6e09e52016-08-09 18:56:48 +000025 for (int i = 0; i < state.range(0); ++i) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000026 benchmark::DoNotOptimize(i);
27 }
Eric Fiselier19039762018-01-18 04:23:01 +000028 for (auto _ : state) {
Eric Fiselierf6e09e52016-08-09 18:56:48 +000029 for (int i = 0; i < state.range(0); ++i) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000030 benchmark::DoNotOptimize(i);
31 }
32 }
33}
34BASIC_BENCHMARK_TEST(BM_spin_pause_before);
35BASIC_BENCHMARK_TEST(BM_spin_pause_before)->ThreadPerCpu();
36
Eric Fiselierb08d8b12016-07-19 23:07:03 +000037void BM_spin_pause_during(benchmark::State& state) {
Eric Fiselier19039762018-01-18 04:23:01 +000038 for (auto _ : state) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000039 state.PauseTiming();
Eric Fiselierf6e09e52016-08-09 18:56:48 +000040 for (int i = 0; i < state.range(0); ++i) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000041 benchmark::DoNotOptimize(i);
42 }
43 state.ResumeTiming();
Eric Fiselierf6e09e52016-08-09 18:56:48 +000044 for (int i = 0; i < state.range(0); ++i) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000045 benchmark::DoNotOptimize(i);
46 }
47 }
48}
49BASIC_BENCHMARK_TEST(BM_spin_pause_during);
50BASIC_BENCHMARK_TEST(BM_spin_pause_during)->ThreadPerCpu();
51
52void BM_pause_during(benchmark::State& state) {
Eric Fiselier19039762018-01-18 04:23:01 +000053 for (auto _ : state) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000054 state.PauseTiming();
55 state.ResumeTiming();
56 }
57}
58BENCHMARK(BM_pause_during);
59BENCHMARK(BM_pause_during)->ThreadPerCpu();
60BENCHMARK(BM_pause_during)->UseRealTime();
61BENCHMARK(BM_pause_during)->UseRealTime()->ThreadPerCpu();
62
63void BM_spin_pause_after(benchmark::State& state) {
Eric Fiselier19039762018-01-18 04:23:01 +000064 for (auto _ : state) {
Eric Fiselierf6e09e52016-08-09 18:56:48 +000065 for (int i = 0; i < state.range(0); ++i) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000066 benchmark::DoNotOptimize(i);
67 }
68 }
Eric Fiselierf6e09e52016-08-09 18:56:48 +000069 for (int i = 0; i < state.range(0); ++i) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000070 benchmark::DoNotOptimize(i);
71 }
72}
73BASIC_BENCHMARK_TEST(BM_spin_pause_after);
74BASIC_BENCHMARK_TEST(BM_spin_pause_after)->ThreadPerCpu();
75
Eric Fiselierb08d8b12016-07-19 23:07:03 +000076void BM_spin_pause_before_and_after(benchmark::State& state) {
Eric Fiselierf6e09e52016-08-09 18:56:48 +000077 for (int i = 0; i < state.range(0); ++i) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000078 benchmark::DoNotOptimize(i);
79 }
Eric Fiselier19039762018-01-18 04:23:01 +000080 for (auto _ : state) {
Eric Fiselierf6e09e52016-08-09 18:56:48 +000081 for (int i = 0; i < state.range(0); ++i) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000082 benchmark::DoNotOptimize(i);
83 }
84 }
Eric Fiselierf6e09e52016-08-09 18:56:48 +000085 for (int i = 0; i < state.range(0); ++i) {
Eric Fiselierb08d8b12016-07-19 23:07:03 +000086 benchmark::DoNotOptimize(i);
87 }
88}
89BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after);
90BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after)->ThreadPerCpu();
91
Eric Fiselierb08d8b12016-07-19 23:07:03 +000092void BM_empty_stop_start(benchmark::State& state) {
Eric Fiselier19039762018-01-18 04:23:01 +000093 for (auto _ : state) {
Eric Fiselierfbc9ff22016-11-05 00:30:27 +000094 }
Eric Fiselierb08d8b12016-07-19 23:07:03 +000095}
96BENCHMARK(BM_empty_stop_start);
97BENCHMARK(BM_empty_stop_start)->ThreadPerCpu();
98
Eric Fiselier19039762018-01-18 04:23:01 +000099
100void BM_KeepRunning(benchmark::State& state) {
101 size_t iter_count = 0;
Eric Fiselierfcafd3e2018-07-10 04:02:00 +0000102 assert(iter_count == state.iterations());
Eric Fiselier19039762018-01-18 04:23:01 +0000103 while (state.KeepRunning()) {
104 ++iter_count;
105 }
Eric Fiselierfcafd3e2018-07-10 04:02:00 +0000106 assert(iter_count == state.iterations());
Eric Fiselier19039762018-01-18 04:23:01 +0000107}
108BENCHMARK(BM_KeepRunning);
109
Eric Fiselierfcafd3e2018-07-10 04:02:00 +0000110void BM_KeepRunningBatch(benchmark::State& state) {
111 // Choose a prime batch size to avoid evenly dividing max_iterations.
112 const size_t batch_size = 101;
113 size_t iter_count = 0;
114 while (state.KeepRunningBatch(batch_size)) {
115 iter_count += batch_size;
116 }
117 assert(state.iterations() == iter_count);
118}
119BENCHMARK(BM_KeepRunningBatch);
120
Eric Fiselier19039762018-01-18 04:23:01 +0000121void BM_RangedFor(benchmark::State& state) {
122 size_t iter_count = 0;
123 for (auto _ : state) {
124 ++iter_count;
125 }
126 assert(iter_count == state.max_iterations);
127}
128BENCHMARK(BM_RangedFor);
129
Eric Fiselierfcafd3e2018-07-10 04:02:00 +0000130// Ensure that StateIterator provides all the necessary typedefs required to
131// instantiate std::iterator_traits.
132static_assert(std::is_same<
133 typename std::iterator_traits<benchmark::State::StateIterator>::value_type,
134 typename benchmark::State::StateIterator::value_type>::value, "");
135
Eric Fiselier19039762018-01-18 04:23:01 +0000136BENCHMARK_MAIN();