1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
3*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
4*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
5*9356374aSAndroid Build Coastguard Worker //
6*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
7*9356374aSAndroid Build Coastguard Worker //
8*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
9*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
10*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
12*9356374aSAndroid Build Coastguard Worker // limitations under the License.
13*9356374aSAndroid Build Coastguard Worker
14*9356374aSAndroid Build Coastguard Worker #include <cmath>
15*9356374aSAndroid Build Coastguard Worker #include <cstddef>
16*9356374aSAndroid Build Coastguard Worker #include <cstdint>
17*9356374aSAndroid Build Coastguard Worker #include <ctime>
18*9356374aSAndroid Build Coastguard Worker #include <string>
19*9356374aSAndroid Build Coastguard Worker
20*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
21*9356374aSAndroid Build Coastguard Worker #include "absl/flags/flag.h"
22*9356374aSAndroid Build Coastguard Worker #include "absl/time/time.h"
23*9356374aSAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
24*9356374aSAndroid Build Coastguard Worker
25*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::Duration, absl_duration_flag_for_benchmark,
26*9356374aSAndroid Build Coastguard Worker absl::Milliseconds(1),
27*9356374aSAndroid Build Coastguard Worker "Flag to use for benchmarking duration flag access speed.");
28*9356374aSAndroid Build Coastguard Worker
29*9356374aSAndroid Build Coastguard Worker namespace {
30*9356374aSAndroid Build Coastguard Worker
31*9356374aSAndroid Build Coastguard Worker //
32*9356374aSAndroid Build Coastguard Worker // Factory functions
33*9356374aSAndroid Build Coastguard Worker //
34*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_Nanoseconds(benchmark::State & state)35*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_Nanoseconds(benchmark::State& state) {
36*9356374aSAndroid Build Coastguard Worker int64_t i = 0;
37*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
38*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Nanoseconds(i));
39*9356374aSAndroid Build Coastguard Worker i += 314159;
40*9356374aSAndroid Build Coastguard Worker }
41*9356374aSAndroid Build Coastguard Worker }
42*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_Nanoseconds);
43*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_Microseconds(benchmark::State & state)44*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_Microseconds(benchmark::State& state) {
45*9356374aSAndroid Build Coastguard Worker int64_t i = 0;
46*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
47*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Microseconds(i));
48*9356374aSAndroid Build Coastguard Worker i += 314;
49*9356374aSAndroid Build Coastguard Worker }
50*9356374aSAndroid Build Coastguard Worker }
51*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_Microseconds);
52*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_Milliseconds(benchmark::State & state)53*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_Milliseconds(benchmark::State& state) {
54*9356374aSAndroid Build Coastguard Worker int64_t i = 0;
55*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
56*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Milliseconds(i));
57*9356374aSAndroid Build Coastguard Worker i += 1;
58*9356374aSAndroid Build Coastguard Worker }
59*9356374aSAndroid Build Coastguard Worker }
60*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_Milliseconds);
61*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_Seconds(benchmark::State & state)62*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_Seconds(benchmark::State& state) {
63*9356374aSAndroid Build Coastguard Worker int64_t i = 0;
64*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
65*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Seconds(i));
66*9356374aSAndroid Build Coastguard Worker i += 1;
67*9356374aSAndroid Build Coastguard Worker }
68*9356374aSAndroid Build Coastguard Worker }
69*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_Seconds);
70*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_Minutes(benchmark::State & state)71*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_Minutes(benchmark::State& state) {
72*9356374aSAndroid Build Coastguard Worker int64_t i = 0;
73*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
74*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Minutes(i));
75*9356374aSAndroid Build Coastguard Worker i += 1;
76*9356374aSAndroid Build Coastguard Worker }
77*9356374aSAndroid Build Coastguard Worker }
78*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_Minutes);
79*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_Hours(benchmark::State & state)80*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_Hours(benchmark::State& state) {
81*9356374aSAndroid Build Coastguard Worker int64_t i = 0;
82*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
83*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Hours(i));
84*9356374aSAndroid Build Coastguard Worker i += 1;
85*9356374aSAndroid Build Coastguard Worker }
86*9356374aSAndroid Build Coastguard Worker }
87*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_Hours);
88*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_DoubleNanoseconds(benchmark::State & state)89*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_DoubleNanoseconds(benchmark::State& state) {
90*9356374aSAndroid Build Coastguard Worker double d = 1;
91*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
92*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Nanoseconds(d));
93*9356374aSAndroid Build Coastguard Worker d = d * 1.00000001 + 1;
94*9356374aSAndroid Build Coastguard Worker }
95*9356374aSAndroid Build Coastguard Worker }
96*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_DoubleNanoseconds);
97*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_DoubleMicroseconds(benchmark::State & state)98*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_DoubleMicroseconds(benchmark::State& state) {
99*9356374aSAndroid Build Coastguard Worker double d = 1e-3;
100*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
101*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Microseconds(d));
102*9356374aSAndroid Build Coastguard Worker d = d * 1.00000001 + 1e-3;
103*9356374aSAndroid Build Coastguard Worker }
104*9356374aSAndroid Build Coastguard Worker }
105*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_DoubleMicroseconds);
106*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_DoubleMilliseconds(benchmark::State & state)107*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_DoubleMilliseconds(benchmark::State& state) {
108*9356374aSAndroid Build Coastguard Worker double d = 1e-6;
109*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
110*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Milliseconds(d));
111*9356374aSAndroid Build Coastguard Worker d = d * 1.00000001 + 1e-6;
112*9356374aSAndroid Build Coastguard Worker }
113*9356374aSAndroid Build Coastguard Worker }
114*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_DoubleMilliseconds);
115*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_DoubleSeconds(benchmark::State & state)116*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_DoubleSeconds(benchmark::State& state) {
117*9356374aSAndroid Build Coastguard Worker double d = 1e-9;
118*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
119*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Seconds(d));
120*9356374aSAndroid Build Coastguard Worker d = d * 1.00000001 + 1e-9;
121*9356374aSAndroid Build Coastguard Worker }
122*9356374aSAndroid Build Coastguard Worker }
123*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_DoubleSeconds);
124*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_DoubleMinutes(benchmark::State & state)125*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_DoubleMinutes(benchmark::State& state) {
126*9356374aSAndroid Build Coastguard Worker double d = 1e-9;
127*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
128*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Minutes(d));
129*9356374aSAndroid Build Coastguard Worker d = d * 1.00000001 + 1e-9;
130*9356374aSAndroid Build Coastguard Worker }
131*9356374aSAndroid Build Coastguard Worker }
132*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_DoubleMinutes);
133*9356374aSAndroid Build Coastguard Worker
BM_Duration_Factory_DoubleHours(benchmark::State & state)134*9356374aSAndroid Build Coastguard Worker void BM_Duration_Factory_DoubleHours(benchmark::State& state) {
135*9356374aSAndroid Build Coastguard Worker double d = 1e-9;
136*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
137*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::Hours(d));
138*9356374aSAndroid Build Coastguard Worker d = d * 1.00000001 + 1e-9;
139*9356374aSAndroid Build Coastguard Worker }
140*9356374aSAndroid Build Coastguard Worker }
141*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Factory_DoubleHours);
142*9356374aSAndroid Build Coastguard Worker
143*9356374aSAndroid Build Coastguard Worker //
144*9356374aSAndroid Build Coastguard Worker // Arithmetic
145*9356374aSAndroid Build Coastguard Worker //
146*9356374aSAndroid Build Coastguard Worker
BM_Duration_Addition(benchmark::State & state)147*9356374aSAndroid Build Coastguard Worker void BM_Duration_Addition(benchmark::State& state) {
148*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Nanoseconds(1);
149*9356374aSAndroid Build Coastguard Worker absl::Duration step = absl::Milliseconds(1);
150*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
151*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(d += step);
152*9356374aSAndroid Build Coastguard Worker }
153*9356374aSAndroid Build Coastguard Worker }
154*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Addition);
155*9356374aSAndroid Build Coastguard Worker
BM_Duration_Subtraction(benchmark::State & state)156*9356374aSAndroid Build Coastguard Worker void BM_Duration_Subtraction(benchmark::State& state) {
157*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(std::numeric_limits<int64_t>::max());
158*9356374aSAndroid Build Coastguard Worker absl::Duration step = absl::Milliseconds(1);
159*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
160*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(d -= step);
161*9356374aSAndroid Build Coastguard Worker }
162*9356374aSAndroid Build Coastguard Worker }
163*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Subtraction);
164*9356374aSAndroid Build Coastguard Worker
BM_Duration_Multiplication_Fixed(benchmark::State & state)165*9356374aSAndroid Build Coastguard Worker void BM_Duration_Multiplication_Fixed(benchmark::State& state) {
166*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Milliseconds(1);
167*9356374aSAndroid Build Coastguard Worker absl::Duration s;
168*9356374aSAndroid Build Coastguard Worker int i = 0;
169*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
170*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(s += d * (i + 1));
171*9356374aSAndroid Build Coastguard Worker ++i;
172*9356374aSAndroid Build Coastguard Worker }
173*9356374aSAndroid Build Coastguard Worker }
174*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Multiplication_Fixed);
175*9356374aSAndroid Build Coastguard Worker
BM_Duration_Multiplication_Double(benchmark::State & state)176*9356374aSAndroid Build Coastguard Worker void BM_Duration_Multiplication_Double(benchmark::State& state) {
177*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Milliseconds(1);
178*9356374aSAndroid Build Coastguard Worker absl::Duration s;
179*9356374aSAndroid Build Coastguard Worker int i = 0;
180*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
181*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(s += d * (i + 1.0));
182*9356374aSAndroid Build Coastguard Worker ++i;
183*9356374aSAndroid Build Coastguard Worker }
184*9356374aSAndroid Build Coastguard Worker }
185*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Multiplication_Double);
186*9356374aSAndroid Build Coastguard Worker
BM_Duration_Division_Fixed(benchmark::State & state)187*9356374aSAndroid Build Coastguard Worker void BM_Duration_Division_Fixed(benchmark::State& state) {
188*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(1);
189*9356374aSAndroid Build Coastguard Worker int i = 0;
190*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
191*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(d /= i + 1);
192*9356374aSAndroid Build Coastguard Worker ++i;
193*9356374aSAndroid Build Coastguard Worker }
194*9356374aSAndroid Build Coastguard Worker }
195*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Division_Fixed);
196*9356374aSAndroid Build Coastguard Worker
BM_Duration_Division_Double(benchmark::State & state)197*9356374aSAndroid Build Coastguard Worker void BM_Duration_Division_Double(benchmark::State& state) {
198*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(1);
199*9356374aSAndroid Build Coastguard Worker int i = 0;
200*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
201*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(d /= i + 1.0);
202*9356374aSAndroid Build Coastguard Worker ++i;
203*9356374aSAndroid Build Coastguard Worker }
204*9356374aSAndroid Build Coastguard Worker }
205*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Division_Double);
206*9356374aSAndroid Build Coastguard Worker
BM_Duration_FDivDuration_Nanoseconds(benchmark::State & state)207*9356374aSAndroid Build Coastguard Worker void BM_Duration_FDivDuration_Nanoseconds(benchmark::State& state) {
208*9356374aSAndroid Build Coastguard Worker double d = 1;
209*9356374aSAndroid Build Coastguard Worker int i = 0;
210*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
211*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(
212*9356374aSAndroid Build Coastguard Worker d += absl::FDivDuration(absl::Milliseconds(i), absl::Nanoseconds(1)));
213*9356374aSAndroid Build Coastguard Worker ++i;
214*9356374aSAndroid Build Coastguard Worker }
215*9356374aSAndroid Build Coastguard Worker }
216*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_FDivDuration_Nanoseconds);
217*9356374aSAndroid Build Coastguard Worker
BM_Duration_IDivDuration_Nanoseconds(benchmark::State & state)218*9356374aSAndroid Build Coastguard Worker void BM_Duration_IDivDuration_Nanoseconds(benchmark::State& state) {
219*9356374aSAndroid Build Coastguard Worker int64_t a = 1;
220*9356374aSAndroid Build Coastguard Worker absl::Duration ignore;
221*9356374aSAndroid Build Coastguard Worker int i = 0;
222*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
223*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(a +=
224*9356374aSAndroid Build Coastguard Worker absl::IDivDuration(absl::Nanoseconds(i),
225*9356374aSAndroid Build Coastguard Worker absl::Nanoseconds(1), &ignore));
226*9356374aSAndroid Build Coastguard Worker ++i;
227*9356374aSAndroid Build Coastguard Worker }
228*9356374aSAndroid Build Coastguard Worker }
229*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_IDivDuration_Nanoseconds);
230*9356374aSAndroid Build Coastguard Worker
BM_Duration_IDivDuration_Microseconds(benchmark::State & state)231*9356374aSAndroid Build Coastguard Worker void BM_Duration_IDivDuration_Microseconds(benchmark::State& state) {
232*9356374aSAndroid Build Coastguard Worker int64_t a = 1;
233*9356374aSAndroid Build Coastguard Worker absl::Duration ignore;
234*9356374aSAndroid Build Coastguard Worker int i = 0;
235*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
236*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(a += absl::IDivDuration(absl::Microseconds(i),
237*9356374aSAndroid Build Coastguard Worker absl::Microseconds(1),
238*9356374aSAndroid Build Coastguard Worker &ignore));
239*9356374aSAndroid Build Coastguard Worker ++i;
240*9356374aSAndroid Build Coastguard Worker }
241*9356374aSAndroid Build Coastguard Worker }
242*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_IDivDuration_Microseconds);
243*9356374aSAndroid Build Coastguard Worker
BM_Duration_IDivDuration_Milliseconds(benchmark::State & state)244*9356374aSAndroid Build Coastguard Worker void BM_Duration_IDivDuration_Milliseconds(benchmark::State& state) {
245*9356374aSAndroid Build Coastguard Worker int64_t a = 1;
246*9356374aSAndroid Build Coastguard Worker absl::Duration ignore;
247*9356374aSAndroid Build Coastguard Worker int i = 0;
248*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
249*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(a += absl::IDivDuration(absl::Milliseconds(i),
250*9356374aSAndroid Build Coastguard Worker absl::Milliseconds(1),
251*9356374aSAndroid Build Coastguard Worker &ignore));
252*9356374aSAndroid Build Coastguard Worker ++i;
253*9356374aSAndroid Build Coastguard Worker }
254*9356374aSAndroid Build Coastguard Worker }
255*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_IDivDuration_Milliseconds);
256*9356374aSAndroid Build Coastguard Worker
BM_Duration_IDivDuration_Seconds(benchmark::State & state)257*9356374aSAndroid Build Coastguard Worker void BM_Duration_IDivDuration_Seconds(benchmark::State& state) {
258*9356374aSAndroid Build Coastguard Worker int64_t a = 1;
259*9356374aSAndroid Build Coastguard Worker absl::Duration ignore;
260*9356374aSAndroid Build Coastguard Worker int i = 0;
261*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
262*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(
263*9356374aSAndroid Build Coastguard Worker a += absl::IDivDuration(absl::Seconds(i), absl::Seconds(1), &ignore));
264*9356374aSAndroid Build Coastguard Worker ++i;
265*9356374aSAndroid Build Coastguard Worker }
266*9356374aSAndroid Build Coastguard Worker }
267*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_IDivDuration_Seconds);
268*9356374aSAndroid Build Coastguard Worker
BM_Duration_IDivDuration_Minutes(benchmark::State & state)269*9356374aSAndroid Build Coastguard Worker void BM_Duration_IDivDuration_Minutes(benchmark::State& state) {
270*9356374aSAndroid Build Coastguard Worker int64_t a = 1;
271*9356374aSAndroid Build Coastguard Worker absl::Duration ignore;
272*9356374aSAndroid Build Coastguard Worker int i = 0;
273*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
274*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(
275*9356374aSAndroid Build Coastguard Worker a += absl::IDivDuration(absl::Minutes(i), absl::Minutes(1), &ignore));
276*9356374aSAndroid Build Coastguard Worker ++i;
277*9356374aSAndroid Build Coastguard Worker }
278*9356374aSAndroid Build Coastguard Worker }
279*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_IDivDuration_Minutes);
280*9356374aSAndroid Build Coastguard Worker
BM_Duration_IDivDuration_Hours(benchmark::State & state)281*9356374aSAndroid Build Coastguard Worker void BM_Duration_IDivDuration_Hours(benchmark::State& state) {
282*9356374aSAndroid Build Coastguard Worker int64_t a = 1;
283*9356374aSAndroid Build Coastguard Worker absl::Duration ignore;
284*9356374aSAndroid Build Coastguard Worker int i = 0;
285*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
286*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(
287*9356374aSAndroid Build Coastguard Worker a += absl::IDivDuration(absl::Hours(i), absl::Hours(1), &ignore));
288*9356374aSAndroid Build Coastguard Worker ++i;
289*9356374aSAndroid Build Coastguard Worker }
290*9356374aSAndroid Build Coastguard Worker }
291*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_IDivDuration_Hours);
292*9356374aSAndroid Build Coastguard Worker
BM_Duration_Modulo(benchmark::State & state)293*9356374aSAndroid Build Coastguard Worker void BM_Duration_Modulo(benchmark::State& state) {
294*9356374aSAndroid Build Coastguard Worker int i = 0;
295*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
296*9356374aSAndroid Build Coastguard Worker auto mod = absl::Seconds(i) % absl::Nanoseconds(12345);
297*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(mod);
298*9356374aSAndroid Build Coastguard Worker ++i;
299*9356374aSAndroid Build Coastguard Worker }
300*9356374aSAndroid Build Coastguard Worker }
301*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Modulo);
302*9356374aSAndroid Build Coastguard Worker
BM_Duration_Modulo_FastPath(benchmark::State & state)303*9356374aSAndroid Build Coastguard Worker void BM_Duration_Modulo_FastPath(benchmark::State& state) {
304*9356374aSAndroid Build Coastguard Worker int i = 0;
305*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
306*9356374aSAndroid Build Coastguard Worker auto mod = absl::Seconds(i) % absl::Milliseconds(1);
307*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(mod);
308*9356374aSAndroid Build Coastguard Worker ++i;
309*9356374aSAndroid Build Coastguard Worker }
310*9356374aSAndroid Build Coastguard Worker }
311*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_Modulo_FastPath);
312*9356374aSAndroid Build Coastguard Worker
BM_Duration_ToInt64Nanoseconds(benchmark::State & state)313*9356374aSAndroid Build Coastguard Worker void BM_Duration_ToInt64Nanoseconds(benchmark::State& state) {
314*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(100000);
315*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
316*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::ToInt64Nanoseconds(d));
317*9356374aSAndroid Build Coastguard Worker }
318*9356374aSAndroid Build Coastguard Worker }
319*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_ToInt64Nanoseconds);
320*9356374aSAndroid Build Coastguard Worker
BM_Duration_ToInt64Microseconds(benchmark::State & state)321*9356374aSAndroid Build Coastguard Worker void BM_Duration_ToInt64Microseconds(benchmark::State& state) {
322*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(100000);
323*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
324*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::ToInt64Microseconds(d));
325*9356374aSAndroid Build Coastguard Worker }
326*9356374aSAndroid Build Coastguard Worker }
327*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_ToInt64Microseconds);
328*9356374aSAndroid Build Coastguard Worker
BM_Duration_ToInt64Milliseconds(benchmark::State & state)329*9356374aSAndroid Build Coastguard Worker void BM_Duration_ToInt64Milliseconds(benchmark::State& state) {
330*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(100000);
331*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
332*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::ToInt64Milliseconds(d));
333*9356374aSAndroid Build Coastguard Worker }
334*9356374aSAndroid Build Coastguard Worker }
335*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_ToInt64Milliseconds);
336*9356374aSAndroid Build Coastguard Worker
BM_Duration_ToInt64Seconds(benchmark::State & state)337*9356374aSAndroid Build Coastguard Worker void BM_Duration_ToInt64Seconds(benchmark::State& state) {
338*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(100000);
339*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
340*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::ToInt64Seconds(d));
341*9356374aSAndroid Build Coastguard Worker }
342*9356374aSAndroid Build Coastguard Worker }
343*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_ToInt64Seconds);
344*9356374aSAndroid Build Coastguard Worker
BM_Duration_ToInt64Minutes(benchmark::State & state)345*9356374aSAndroid Build Coastguard Worker void BM_Duration_ToInt64Minutes(benchmark::State& state) {
346*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(100000);
347*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
348*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::ToInt64Minutes(d));
349*9356374aSAndroid Build Coastguard Worker }
350*9356374aSAndroid Build Coastguard Worker }
351*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_ToInt64Minutes);
352*9356374aSAndroid Build Coastguard Worker
BM_Duration_ToInt64Hours(benchmark::State & state)353*9356374aSAndroid Build Coastguard Worker void BM_Duration_ToInt64Hours(benchmark::State& state) {
354*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(100000);
355*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
356*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::ToInt64Hours(d));
357*9356374aSAndroid Build Coastguard Worker }
358*9356374aSAndroid Build Coastguard Worker }
359*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_ToInt64Hours);
360*9356374aSAndroid Build Coastguard Worker
361*9356374aSAndroid Build Coastguard Worker //
362*9356374aSAndroid Build Coastguard Worker // To/FromTimespec
363*9356374aSAndroid Build Coastguard Worker //
364*9356374aSAndroid Build Coastguard Worker
BM_Duration_ToTimespec_AbslTime(benchmark::State & state)365*9356374aSAndroid Build Coastguard Worker void BM_Duration_ToTimespec_AbslTime(benchmark::State& state) {
366*9356374aSAndroid Build Coastguard Worker absl::Duration d = absl::Seconds(1);
367*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
368*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::ToTimespec(d));
369*9356374aSAndroid Build Coastguard Worker }
370*9356374aSAndroid Build Coastguard Worker }
371*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_ToTimespec_AbslTime);
372*9356374aSAndroid Build Coastguard Worker
DoubleToTimespec(double seconds)373*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_NOINLINE timespec DoubleToTimespec(double seconds) {
374*9356374aSAndroid Build Coastguard Worker timespec ts;
375*9356374aSAndroid Build Coastguard Worker ts.tv_sec = seconds;
376*9356374aSAndroid Build Coastguard Worker ts.tv_nsec = (seconds - ts.tv_sec) * (1000 * 1000 * 1000);
377*9356374aSAndroid Build Coastguard Worker return ts;
378*9356374aSAndroid Build Coastguard Worker }
379*9356374aSAndroid Build Coastguard Worker
BM_Duration_ToTimespec_Double(benchmark::State & state)380*9356374aSAndroid Build Coastguard Worker void BM_Duration_ToTimespec_Double(benchmark::State& state) {
381*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
382*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(DoubleToTimespec(1.0));
383*9356374aSAndroid Build Coastguard Worker }
384*9356374aSAndroid Build Coastguard Worker }
385*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_ToTimespec_Double);
386*9356374aSAndroid Build Coastguard Worker
BM_Duration_FromTimespec_AbslTime(benchmark::State & state)387*9356374aSAndroid Build Coastguard Worker void BM_Duration_FromTimespec_AbslTime(benchmark::State& state) {
388*9356374aSAndroid Build Coastguard Worker timespec ts;
389*9356374aSAndroid Build Coastguard Worker ts.tv_sec = 0;
390*9356374aSAndroid Build Coastguard Worker ts.tv_nsec = 0;
391*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
392*9356374aSAndroid Build Coastguard Worker if (++ts.tv_nsec == 1000 * 1000 * 1000) {
393*9356374aSAndroid Build Coastguard Worker ++ts.tv_sec;
394*9356374aSAndroid Build Coastguard Worker ts.tv_nsec = 0;
395*9356374aSAndroid Build Coastguard Worker }
396*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::DurationFromTimespec(ts));
397*9356374aSAndroid Build Coastguard Worker }
398*9356374aSAndroid Build Coastguard Worker }
399*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_FromTimespec_AbslTime);
400*9356374aSAndroid Build Coastguard Worker
TimespecToDouble(timespec ts)401*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_NOINLINE double TimespecToDouble(timespec ts) {
402*9356374aSAndroid Build Coastguard Worker return ts.tv_sec + (ts.tv_nsec / (1000 * 1000 * 1000));
403*9356374aSAndroid Build Coastguard Worker }
404*9356374aSAndroid Build Coastguard Worker
BM_Duration_FromTimespec_Double(benchmark::State & state)405*9356374aSAndroid Build Coastguard Worker void BM_Duration_FromTimespec_Double(benchmark::State& state) {
406*9356374aSAndroid Build Coastguard Worker timespec ts;
407*9356374aSAndroid Build Coastguard Worker ts.tv_sec = 0;
408*9356374aSAndroid Build Coastguard Worker ts.tv_nsec = 0;
409*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
410*9356374aSAndroid Build Coastguard Worker if (++ts.tv_nsec == 1000 * 1000 * 1000) {
411*9356374aSAndroid Build Coastguard Worker ++ts.tv_sec;
412*9356374aSAndroid Build Coastguard Worker ts.tv_nsec = 0;
413*9356374aSAndroid Build Coastguard Worker }
414*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(TimespecToDouble(ts));
415*9356374aSAndroid Build Coastguard Worker }
416*9356374aSAndroid Build Coastguard Worker }
417*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_FromTimespec_Double);
418*9356374aSAndroid Build Coastguard Worker
419*9356374aSAndroid Build Coastguard Worker //
420*9356374aSAndroid Build Coastguard Worker // String conversions
421*9356374aSAndroid Build Coastguard Worker //
422*9356374aSAndroid Build Coastguard Worker
423*9356374aSAndroid Build Coastguard Worker const char* const kDurations[] = {
424*9356374aSAndroid Build Coastguard Worker "0", // 0
425*9356374aSAndroid Build Coastguard Worker "123ns", // 1
426*9356374aSAndroid Build Coastguard Worker "1h2m3s", // 2
427*9356374aSAndroid Build Coastguard Worker "-2h3m4.005006007s", // 3
428*9356374aSAndroid Build Coastguard Worker "2562047788015215h30m7.99999999975s", // 4
429*9356374aSAndroid Build Coastguard Worker };
430*9356374aSAndroid Build Coastguard Worker const int kNumDurations = sizeof(kDurations) / sizeof(kDurations[0]);
431*9356374aSAndroid Build Coastguard Worker
BM_Duration_FormatDuration(benchmark::State & state)432*9356374aSAndroid Build Coastguard Worker void BM_Duration_FormatDuration(benchmark::State& state) {
433*9356374aSAndroid Build Coastguard Worker const std::string s = kDurations[state.range(0)];
434*9356374aSAndroid Build Coastguard Worker state.SetLabel(s);
435*9356374aSAndroid Build Coastguard Worker absl::Duration d;
436*9356374aSAndroid Build Coastguard Worker absl::ParseDuration(kDurations[state.range(0)], &d);
437*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
438*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::FormatDuration(d));
439*9356374aSAndroid Build Coastguard Worker }
440*9356374aSAndroid Build Coastguard Worker }
441*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_FormatDuration)->DenseRange(0, kNumDurations - 1);
442*9356374aSAndroid Build Coastguard Worker
BM_Duration_ParseDuration(benchmark::State & state)443*9356374aSAndroid Build Coastguard Worker void BM_Duration_ParseDuration(benchmark::State& state) {
444*9356374aSAndroid Build Coastguard Worker const std::string s = kDurations[state.range(0)];
445*9356374aSAndroid Build Coastguard Worker state.SetLabel(s);
446*9356374aSAndroid Build Coastguard Worker absl::Duration d;
447*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
448*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(absl::ParseDuration(s, &d));
449*9356374aSAndroid Build Coastguard Worker }
450*9356374aSAndroid Build Coastguard Worker }
451*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_ParseDuration)->DenseRange(0, kNumDurations - 1);
452*9356374aSAndroid Build Coastguard Worker
453*9356374aSAndroid Build Coastguard Worker //
454*9356374aSAndroid Build Coastguard Worker // Flag access
455*9356374aSAndroid Build Coastguard Worker //
BM_Duration_GetFlag(benchmark::State & state)456*9356374aSAndroid Build Coastguard Worker void BM_Duration_GetFlag(benchmark::State& state) {
457*9356374aSAndroid Build Coastguard Worker while (state.KeepRunning()) {
458*9356374aSAndroid Build Coastguard Worker benchmark::DoNotOptimize(
459*9356374aSAndroid Build Coastguard Worker absl::GetFlag(FLAGS_absl_duration_flag_for_benchmark));
460*9356374aSAndroid Build Coastguard Worker }
461*9356374aSAndroid Build Coastguard Worker }
462*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Duration_GetFlag);
463*9356374aSAndroid Build Coastguard Worker
464*9356374aSAndroid Build Coastguard Worker } // namespace
465