annotate libcxx/utils/google-benchmark/test/basic_test.cc @ 223:5f17cb93ff66 llvm-original

LLVM13 (2021/7/18)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 18 Jul 2021 22:43:00 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1
anatofuz
parents:
diff changeset
2 #include "benchmark/benchmark.h"
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 #define BASIC_BENCHMARK_TEST(x) BENCHMARK(x)->Arg(8)->Arg(512)->Arg(8192)
anatofuz
parents:
diff changeset
5
anatofuz
parents:
diff changeset
6 void BM_empty(benchmark::State& state) {
anatofuz
parents:
diff changeset
7 for (auto _ : state) {
anatofuz
parents:
diff changeset
8 benchmark::DoNotOptimize(state.iterations());
anatofuz
parents:
diff changeset
9 }
anatofuz
parents:
diff changeset
10 }
anatofuz
parents:
diff changeset
11 BENCHMARK(BM_empty);
anatofuz
parents:
diff changeset
12 BENCHMARK(BM_empty)->ThreadPerCpu();
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 void BM_spin_empty(benchmark::State& state) {
anatofuz
parents:
diff changeset
15 for (auto _ : state) {
anatofuz
parents:
diff changeset
16 for (int x = 0; x < state.range(0); ++x) {
anatofuz
parents:
diff changeset
17 benchmark::DoNotOptimize(x);
anatofuz
parents:
diff changeset
18 }
anatofuz
parents:
diff changeset
19 }
anatofuz
parents:
diff changeset
20 }
anatofuz
parents:
diff changeset
21 BASIC_BENCHMARK_TEST(BM_spin_empty);
anatofuz
parents:
diff changeset
22 BASIC_BENCHMARK_TEST(BM_spin_empty)->ThreadPerCpu();
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 void BM_spin_pause_before(benchmark::State& state) {
anatofuz
parents:
diff changeset
25 for (int i = 0; i < state.range(0); ++i) {
anatofuz
parents:
diff changeset
26 benchmark::DoNotOptimize(i);
anatofuz
parents:
diff changeset
27 }
anatofuz
parents:
diff changeset
28 for (auto _ : state) {
anatofuz
parents:
diff changeset
29 for (int i = 0; i < state.range(0); ++i) {
anatofuz
parents:
diff changeset
30 benchmark::DoNotOptimize(i);
anatofuz
parents:
diff changeset
31 }
anatofuz
parents:
diff changeset
32 }
anatofuz
parents:
diff changeset
33 }
anatofuz
parents:
diff changeset
34 BASIC_BENCHMARK_TEST(BM_spin_pause_before);
anatofuz
parents:
diff changeset
35 BASIC_BENCHMARK_TEST(BM_spin_pause_before)->ThreadPerCpu();
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 void BM_spin_pause_during(benchmark::State& state) {
anatofuz
parents:
diff changeset
38 for (auto _ : state) {
anatofuz
parents:
diff changeset
39 state.PauseTiming();
anatofuz
parents:
diff changeset
40 for (int i = 0; i < state.range(0); ++i) {
anatofuz
parents:
diff changeset
41 benchmark::DoNotOptimize(i);
anatofuz
parents:
diff changeset
42 }
anatofuz
parents:
diff changeset
43 state.ResumeTiming();
anatofuz
parents:
diff changeset
44 for (int i = 0; i < state.range(0); ++i) {
anatofuz
parents:
diff changeset
45 benchmark::DoNotOptimize(i);
anatofuz
parents:
diff changeset
46 }
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48 }
anatofuz
parents:
diff changeset
49 BASIC_BENCHMARK_TEST(BM_spin_pause_during);
anatofuz
parents:
diff changeset
50 BASIC_BENCHMARK_TEST(BM_spin_pause_during)->ThreadPerCpu();
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 void BM_pause_during(benchmark::State& state) {
anatofuz
parents:
diff changeset
53 for (auto _ : state) {
anatofuz
parents:
diff changeset
54 state.PauseTiming();
anatofuz
parents:
diff changeset
55 state.ResumeTiming();
anatofuz
parents:
diff changeset
56 }
anatofuz
parents:
diff changeset
57 }
anatofuz
parents:
diff changeset
58 BENCHMARK(BM_pause_during);
anatofuz
parents:
diff changeset
59 BENCHMARK(BM_pause_during)->ThreadPerCpu();
anatofuz
parents:
diff changeset
60 BENCHMARK(BM_pause_during)->UseRealTime();
anatofuz
parents:
diff changeset
61 BENCHMARK(BM_pause_during)->UseRealTime()->ThreadPerCpu();
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 void BM_spin_pause_after(benchmark::State& state) {
anatofuz
parents:
diff changeset
64 for (auto _ : state) {
anatofuz
parents:
diff changeset
65 for (int i = 0; i < state.range(0); ++i) {
anatofuz
parents:
diff changeset
66 benchmark::DoNotOptimize(i);
anatofuz
parents:
diff changeset
67 }
anatofuz
parents:
diff changeset
68 }
anatofuz
parents:
diff changeset
69 for (int i = 0; i < state.range(0); ++i) {
anatofuz
parents:
diff changeset
70 benchmark::DoNotOptimize(i);
anatofuz
parents:
diff changeset
71 }
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73 BASIC_BENCHMARK_TEST(BM_spin_pause_after);
anatofuz
parents:
diff changeset
74 BASIC_BENCHMARK_TEST(BM_spin_pause_after)->ThreadPerCpu();
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 void BM_spin_pause_before_and_after(benchmark::State& state) {
anatofuz
parents:
diff changeset
77 for (int i = 0; i < state.range(0); ++i) {
anatofuz
parents:
diff changeset
78 benchmark::DoNotOptimize(i);
anatofuz
parents:
diff changeset
79 }
anatofuz
parents:
diff changeset
80 for (auto _ : state) {
anatofuz
parents:
diff changeset
81 for (int i = 0; i < state.range(0); ++i) {
anatofuz
parents:
diff changeset
82 benchmark::DoNotOptimize(i);
anatofuz
parents:
diff changeset
83 }
anatofuz
parents:
diff changeset
84 }
anatofuz
parents:
diff changeset
85 for (int i = 0; i < state.range(0); ++i) {
anatofuz
parents:
diff changeset
86 benchmark::DoNotOptimize(i);
anatofuz
parents:
diff changeset
87 }
anatofuz
parents:
diff changeset
88 }
anatofuz
parents:
diff changeset
89 BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after);
anatofuz
parents:
diff changeset
90 BASIC_BENCHMARK_TEST(BM_spin_pause_before_and_after)->ThreadPerCpu();
anatofuz
parents:
diff changeset
91
anatofuz
parents:
diff changeset
92 void BM_empty_stop_start(benchmark::State& state) {
anatofuz
parents:
diff changeset
93 for (auto _ : state) {
anatofuz
parents:
diff changeset
94 }
anatofuz
parents:
diff changeset
95 }
anatofuz
parents:
diff changeset
96 BENCHMARK(BM_empty_stop_start);
anatofuz
parents:
diff changeset
97 BENCHMARK(BM_empty_stop_start)->ThreadPerCpu();
anatofuz
parents:
diff changeset
98
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 void BM_KeepRunning(benchmark::State& state) {
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
101 benchmark::IterationCount iter_count = 0;
150
anatofuz
parents:
diff changeset
102 assert(iter_count == state.iterations());
anatofuz
parents:
diff changeset
103 while (state.KeepRunning()) {
anatofuz
parents:
diff changeset
104 ++iter_count;
anatofuz
parents:
diff changeset
105 }
anatofuz
parents:
diff changeset
106 assert(iter_count == state.iterations());
anatofuz
parents:
diff changeset
107 }
anatofuz
parents:
diff changeset
108 BENCHMARK(BM_KeepRunning);
anatofuz
parents:
diff changeset
109
anatofuz
parents:
diff changeset
110 void BM_KeepRunningBatch(benchmark::State& state) {
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
111 // Choose a batch size >1000 to skip the typical runs with iteration
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
112 // targets of 10, 100 and 1000. If these are not actually skipped the
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
113 // bug would be detectable as consecutive runs with the same iteration
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
114 // count. Below we assert that this does not happen.
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
115 const benchmark::IterationCount batch_size = 1009;
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
116
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
117 static benchmark::IterationCount prior_iter_count = 0;
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
118 benchmark::IterationCount iter_count = 0;
150
anatofuz
parents:
diff changeset
119 while (state.KeepRunningBatch(batch_size)) {
anatofuz
parents:
diff changeset
120 iter_count += batch_size;
anatofuz
parents:
diff changeset
121 }
anatofuz
parents:
diff changeset
122 assert(state.iterations() == iter_count);
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
123
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
124 // Verify that the iteration count always increases across runs (see
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
125 // comment above).
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
126 assert(iter_count == batch_size // max_iterations == 1
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
127 || iter_count > prior_iter_count); // max_iterations > batch_size
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
128 prior_iter_count = iter_count;
150
anatofuz
parents:
diff changeset
129 }
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
130 // Register with a fixed repetition count to establish the invariant that
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
131 // the iteration count should always change across runs. This overrides
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
132 // the --benchmark_repetitions command line flag, which would otherwise
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
133 // cause this test to fail if set > 1.
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
134 BENCHMARK(BM_KeepRunningBatch)->Repetitions(1);
150
anatofuz
parents:
diff changeset
135
anatofuz
parents:
diff changeset
136 void BM_RangedFor(benchmark::State& state) {
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
137 benchmark::IterationCount iter_count = 0;
150
anatofuz
parents:
diff changeset
138 for (auto _ : state) {
anatofuz
parents:
diff changeset
139 ++iter_count;
anatofuz
parents:
diff changeset
140 }
anatofuz
parents:
diff changeset
141 assert(iter_count == state.max_iterations);
anatofuz
parents:
diff changeset
142 }
anatofuz
parents:
diff changeset
143 BENCHMARK(BM_RangedFor);
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 // Ensure that StateIterator provides all the necessary typedefs required to
anatofuz
parents:
diff changeset
146 // instantiate std::iterator_traits.
anatofuz
parents:
diff changeset
147 static_assert(std::is_same<
anatofuz
parents:
diff changeset
148 typename std::iterator_traits<benchmark::State::StateIterator>::value_type,
anatofuz
parents:
diff changeset
149 typename benchmark::State::StateIterator::value_type>::value, "");
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 BENCHMARK_MAIN();