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


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:17