xref: /aosp_15_r20/external/abseil-cpp/absl/time/time_benchmark.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
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 "absl/time/time.h"
15*9356374aSAndroid Build Coastguard Worker 
16*9356374aSAndroid Build Coastguard Worker #if !defined(_WIN32)
17*9356374aSAndroid Build Coastguard Worker #include <sys/time.h>
18*9356374aSAndroid Build Coastguard Worker #endif  // _WIN32
19*9356374aSAndroid Build Coastguard Worker #include <algorithm>
20*9356374aSAndroid Build Coastguard Worker #include <cmath>
21*9356374aSAndroid Build Coastguard Worker #include <cstddef>
22*9356374aSAndroid Build Coastguard Worker #include <cstring>
23*9356374aSAndroid Build Coastguard Worker #include <ctime>
24*9356374aSAndroid Build Coastguard Worker #include <memory>
25*9356374aSAndroid Build Coastguard Worker #include <string>
26*9356374aSAndroid Build Coastguard Worker 
27*9356374aSAndroid Build Coastguard Worker #include "absl/time/clock.h"
28*9356374aSAndroid Build Coastguard Worker #include "absl/time/internal/test_util.h"
29*9356374aSAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
30*9356374aSAndroid Build Coastguard Worker 
31*9356374aSAndroid Build Coastguard Worker namespace {
32*9356374aSAndroid Build Coastguard Worker 
33*9356374aSAndroid Build Coastguard Worker //
34*9356374aSAndroid Build Coastguard Worker // Addition/Subtraction of a duration
35*9356374aSAndroid Build Coastguard Worker //
36*9356374aSAndroid Build Coastguard Worker 
BM_Time_Arithmetic(benchmark::State & state)37*9356374aSAndroid Build Coastguard Worker void BM_Time_Arithmetic(benchmark::State& state) {
38*9356374aSAndroid Build Coastguard Worker   const absl::Duration nano = absl::Nanoseconds(1);
39*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec = absl::Seconds(1);
40*9356374aSAndroid Build Coastguard Worker   absl::Time t = absl::UnixEpoch();
41*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
42*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(t += nano);
43*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(t -= sec);
44*9356374aSAndroid Build Coastguard Worker   }
45*9356374aSAndroid Build Coastguard Worker }
46*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_Arithmetic);
47*9356374aSAndroid Build Coastguard Worker 
48*9356374aSAndroid Build Coastguard Worker //
49*9356374aSAndroid Build Coastguard Worker // Time difference
50*9356374aSAndroid Build Coastguard Worker //
51*9356374aSAndroid Build Coastguard Worker 
BM_Time_Difference(benchmark::State & state)52*9356374aSAndroid Build Coastguard Worker void BM_Time_Difference(benchmark::State& state) {
53*9356374aSAndroid Build Coastguard Worker   absl::Time start = absl::Now();
54*9356374aSAndroid Build Coastguard Worker   absl::Time end = start + absl::Nanoseconds(1);
55*9356374aSAndroid Build Coastguard Worker   absl::Duration diff;
56*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
57*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(diff += end - start);
58*9356374aSAndroid Build Coastguard Worker   }
59*9356374aSAndroid Build Coastguard Worker }
60*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_Difference);
61*9356374aSAndroid Build Coastguard Worker 
62*9356374aSAndroid Build Coastguard Worker //
63*9356374aSAndroid Build Coastguard Worker // ToDateTime
64*9356374aSAndroid Build Coastguard Worker //
65*9356374aSAndroid Build Coastguard Worker // In each "ToDateTime" benchmark we switch between two instants
66*9356374aSAndroid Build Coastguard Worker // separated by at least one transition in order to defeat any
67*9356374aSAndroid Build Coastguard Worker // internal caching of previous results (e.g., see local_time_hint_).
68*9356374aSAndroid Build Coastguard Worker //
69*9356374aSAndroid Build Coastguard Worker // The "UTC" variants use UTC instead of the Google/local time zone.
70*9356374aSAndroid Build Coastguard Worker //
71*9356374aSAndroid Build Coastguard Worker 
BM_Time_ToDateTime_Absl(benchmark::State & state)72*9356374aSAndroid Build Coastguard Worker void BM_Time_ToDateTime_Absl(benchmark::State& state) {
73*9356374aSAndroid Build Coastguard Worker   const absl::TimeZone tz =
74*9356374aSAndroid Build Coastguard Worker       absl::time_internal::LoadTimeZone("America/Los_Angeles");
75*9356374aSAndroid Build Coastguard Worker   absl::Time t = absl::FromUnixSeconds(1384569027);
76*9356374aSAndroid Build Coastguard Worker   absl::Time t2 = absl::FromUnixSeconds(1418962578);
77*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
78*9356374aSAndroid Build Coastguard Worker     std::swap(t, t2);
79*9356374aSAndroid Build Coastguard Worker     t += absl::Seconds(1);
80*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(t.In(tz));
81*9356374aSAndroid Build Coastguard Worker   }
82*9356374aSAndroid Build Coastguard Worker }
83*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_ToDateTime_Absl);
84*9356374aSAndroid Build Coastguard Worker 
BM_Time_ToDateTime_Libc(benchmark::State & state)85*9356374aSAndroid Build Coastguard Worker void BM_Time_ToDateTime_Libc(benchmark::State& state) {
86*9356374aSAndroid Build Coastguard Worker   // No timezone support, so just use localtime.
87*9356374aSAndroid Build Coastguard Worker   time_t t = 1384569027;
88*9356374aSAndroid Build Coastguard Worker   time_t t2 = 1418962578;
89*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
90*9356374aSAndroid Build Coastguard Worker     std::swap(t, t2);
91*9356374aSAndroid Build Coastguard Worker     t += 1;
92*9356374aSAndroid Build Coastguard Worker     struct tm tm;
93*9356374aSAndroid Build Coastguard Worker #if !defined(_WIN32)
94*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(localtime_r(&t, &tm));
95*9356374aSAndroid Build Coastguard Worker #else   // _WIN32
96*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(localtime_s(&tm, &t));
97*9356374aSAndroid Build Coastguard Worker #endif  // _WIN32
98*9356374aSAndroid Build Coastguard Worker   }
99*9356374aSAndroid Build Coastguard Worker }
100*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_ToDateTime_Libc);
101*9356374aSAndroid Build Coastguard Worker 
BM_Time_ToDateTimeUTC_Absl(benchmark::State & state)102*9356374aSAndroid Build Coastguard Worker void BM_Time_ToDateTimeUTC_Absl(benchmark::State& state) {
103*9356374aSAndroid Build Coastguard Worker   const absl::TimeZone tz = absl::UTCTimeZone();
104*9356374aSAndroid Build Coastguard Worker   absl::Time t = absl::FromUnixSeconds(1384569027);
105*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
106*9356374aSAndroid Build Coastguard Worker     t += absl::Seconds(1);
107*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(t.In(tz));
108*9356374aSAndroid Build Coastguard Worker   }
109*9356374aSAndroid Build Coastguard Worker }
110*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_ToDateTimeUTC_Absl);
111*9356374aSAndroid Build Coastguard Worker 
BM_Time_ToDateTimeUTC_Libc(benchmark::State & state)112*9356374aSAndroid Build Coastguard Worker void BM_Time_ToDateTimeUTC_Libc(benchmark::State& state) {
113*9356374aSAndroid Build Coastguard Worker   time_t t = 1384569027;
114*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
115*9356374aSAndroid Build Coastguard Worker     t += 1;
116*9356374aSAndroid Build Coastguard Worker     struct tm tm;
117*9356374aSAndroid Build Coastguard Worker #if !defined(_WIN32)
118*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(gmtime_r(&t, &tm));
119*9356374aSAndroid Build Coastguard Worker #else   // _WIN32
120*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(gmtime_s(&tm, &t));
121*9356374aSAndroid Build Coastguard Worker #endif  // _WIN32
122*9356374aSAndroid Build Coastguard Worker   }
123*9356374aSAndroid Build Coastguard Worker }
124*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_ToDateTimeUTC_Libc);
125*9356374aSAndroid Build Coastguard Worker 
126*9356374aSAndroid Build Coastguard Worker //
127*9356374aSAndroid Build Coastguard Worker // FromUnixMicros
128*9356374aSAndroid Build Coastguard Worker //
129*9356374aSAndroid Build Coastguard Worker 
BM_Time_FromUnixMicros(benchmark::State & state)130*9356374aSAndroid Build Coastguard Worker void BM_Time_FromUnixMicros(benchmark::State& state) {
131*9356374aSAndroid Build Coastguard Worker   int i = 0;
132*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
133*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(absl::FromUnixMicros(i));
134*9356374aSAndroid Build Coastguard Worker     ++i;
135*9356374aSAndroid Build Coastguard Worker   }
136*9356374aSAndroid Build Coastguard Worker }
137*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_FromUnixMicros);
138*9356374aSAndroid Build Coastguard Worker 
BM_Time_ToUnixNanos(benchmark::State & state)139*9356374aSAndroid Build Coastguard Worker void BM_Time_ToUnixNanos(benchmark::State& state) {
140*9356374aSAndroid Build Coastguard Worker   const absl::Time t = absl::UnixEpoch() + absl::Seconds(123);
141*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
142*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(ToUnixNanos(t));
143*9356374aSAndroid Build Coastguard Worker   }
144*9356374aSAndroid Build Coastguard Worker }
145*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_ToUnixNanos);
146*9356374aSAndroid Build Coastguard Worker 
BM_Time_ToUnixMicros(benchmark::State & state)147*9356374aSAndroid Build Coastguard Worker void BM_Time_ToUnixMicros(benchmark::State& state) {
148*9356374aSAndroid Build Coastguard Worker   const absl::Time t = absl::UnixEpoch() + absl::Seconds(123);
149*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
150*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(ToUnixMicros(t));
151*9356374aSAndroid Build Coastguard Worker   }
152*9356374aSAndroid Build Coastguard Worker }
153*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_ToUnixMicros);
154*9356374aSAndroid Build Coastguard Worker 
BM_Time_ToUnixMillis(benchmark::State & state)155*9356374aSAndroid Build Coastguard Worker void BM_Time_ToUnixMillis(benchmark::State& state) {
156*9356374aSAndroid Build Coastguard Worker   const absl::Time t = absl::UnixEpoch() + absl::Seconds(123);
157*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
158*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(ToUnixMillis(t));
159*9356374aSAndroid Build Coastguard Worker   }
160*9356374aSAndroid Build Coastguard Worker }
161*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_ToUnixMillis);
162*9356374aSAndroid Build Coastguard Worker 
BM_Time_ToUnixSeconds(benchmark::State & state)163*9356374aSAndroid Build Coastguard Worker void BM_Time_ToUnixSeconds(benchmark::State& state) {
164*9356374aSAndroid Build Coastguard Worker   const absl::Time t = absl::UnixEpoch() + absl::Seconds(123);
165*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
166*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(absl::ToUnixSeconds(t));
167*9356374aSAndroid Build Coastguard Worker   }
168*9356374aSAndroid Build Coastguard Worker }
169*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_ToUnixSeconds);
170*9356374aSAndroid Build Coastguard Worker 
171*9356374aSAndroid Build Coastguard Worker //
172*9356374aSAndroid Build Coastguard Worker // FromCivil
173*9356374aSAndroid Build Coastguard Worker //
174*9356374aSAndroid Build Coastguard Worker // In each "FromCivil" benchmark we switch between two YMDhms values
175*9356374aSAndroid Build Coastguard Worker // separated by at least one transition in order to defeat any internal
176*9356374aSAndroid Build Coastguard Worker // caching of previous results (e.g., see time_local_hint_).
177*9356374aSAndroid Build Coastguard Worker //
178*9356374aSAndroid Build Coastguard Worker // The "UTC" variants use UTC instead of the Google/local time zone.
179*9356374aSAndroid Build Coastguard Worker // The "Day0" variants require normalization of the day of month.
180*9356374aSAndroid Build Coastguard Worker //
181*9356374aSAndroid Build Coastguard Worker 
BM_Time_FromCivil_Absl(benchmark::State & state)182*9356374aSAndroid Build Coastguard Worker void BM_Time_FromCivil_Absl(benchmark::State& state) {
183*9356374aSAndroid Build Coastguard Worker   const absl::TimeZone tz =
184*9356374aSAndroid Build Coastguard Worker       absl::time_internal::LoadTimeZone("America/Los_Angeles");
185*9356374aSAndroid Build Coastguard Worker   int i = 0;
186*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
187*9356374aSAndroid Build Coastguard Worker     if ((i & 1) == 0) {
188*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(
189*9356374aSAndroid Build Coastguard Worker           absl::FromCivil(absl::CivilSecond(2014, 12, 18, 20, 16, 18), tz));
190*9356374aSAndroid Build Coastguard Worker     } else {
191*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(
192*9356374aSAndroid Build Coastguard Worker           absl::FromCivil(absl::CivilSecond(2013, 11, 15, 18, 30, 27), tz));
193*9356374aSAndroid Build Coastguard Worker     }
194*9356374aSAndroid Build Coastguard Worker     ++i;
195*9356374aSAndroid Build Coastguard Worker   }
196*9356374aSAndroid Build Coastguard Worker }
197*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_FromCivil_Absl);
198*9356374aSAndroid Build Coastguard Worker 
BM_Time_FromCivil_Libc(benchmark::State & state)199*9356374aSAndroid Build Coastguard Worker void BM_Time_FromCivil_Libc(benchmark::State& state) {
200*9356374aSAndroid Build Coastguard Worker   // No timezone support, so just use localtime.
201*9356374aSAndroid Build Coastguard Worker   int i = 0;
202*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
203*9356374aSAndroid Build Coastguard Worker     struct tm tm;
204*9356374aSAndroid Build Coastguard Worker     if ((i & 1) == 0) {
205*9356374aSAndroid Build Coastguard Worker       tm.tm_year = 2014 - 1900;
206*9356374aSAndroid Build Coastguard Worker       tm.tm_mon = 12 - 1;
207*9356374aSAndroid Build Coastguard Worker       tm.tm_mday = 18;
208*9356374aSAndroid Build Coastguard Worker       tm.tm_hour = 20;
209*9356374aSAndroid Build Coastguard Worker       tm.tm_min = 16;
210*9356374aSAndroid Build Coastguard Worker       tm.tm_sec = 18;
211*9356374aSAndroid Build Coastguard Worker     } else {
212*9356374aSAndroid Build Coastguard Worker       tm.tm_year = 2013 - 1900;
213*9356374aSAndroid Build Coastguard Worker       tm.tm_mon = 11 - 1;
214*9356374aSAndroid Build Coastguard Worker       tm.tm_mday = 15;
215*9356374aSAndroid Build Coastguard Worker       tm.tm_hour = 18;
216*9356374aSAndroid Build Coastguard Worker       tm.tm_min = 30;
217*9356374aSAndroid Build Coastguard Worker       tm.tm_sec = 27;
218*9356374aSAndroid Build Coastguard Worker     }
219*9356374aSAndroid Build Coastguard Worker     tm.tm_isdst = -1;
220*9356374aSAndroid Build Coastguard Worker     mktime(&tm);
221*9356374aSAndroid Build Coastguard Worker     ++i;
222*9356374aSAndroid Build Coastguard Worker   }
223*9356374aSAndroid Build Coastguard Worker }
224*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_FromCivil_Libc);
225*9356374aSAndroid Build Coastguard Worker 
BM_Time_FromCivilUTC_Absl(benchmark::State & state)226*9356374aSAndroid Build Coastguard Worker void BM_Time_FromCivilUTC_Absl(benchmark::State& state) {
227*9356374aSAndroid Build Coastguard Worker   const absl::TimeZone tz = absl::UTCTimeZone();
228*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
229*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(
230*9356374aSAndroid Build Coastguard Worker         absl::FromCivil(absl::CivilSecond(2014, 12, 18, 20, 16, 18), tz));
231*9356374aSAndroid Build Coastguard Worker   }
232*9356374aSAndroid Build Coastguard Worker }
233*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_FromCivilUTC_Absl);
234*9356374aSAndroid Build Coastguard Worker 
BM_Time_FromCivilDay0_Absl(benchmark::State & state)235*9356374aSAndroid Build Coastguard Worker void BM_Time_FromCivilDay0_Absl(benchmark::State& state) {
236*9356374aSAndroid Build Coastguard Worker   const absl::TimeZone tz =
237*9356374aSAndroid Build Coastguard Worker       absl::time_internal::LoadTimeZone("America/Los_Angeles");
238*9356374aSAndroid Build Coastguard Worker   int i = 0;
239*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
240*9356374aSAndroid Build Coastguard Worker     if ((i & 1) == 0) {
241*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(
242*9356374aSAndroid Build Coastguard Worker           absl::FromCivil(absl::CivilSecond(2014, 12, 0, 20, 16, 18), tz));
243*9356374aSAndroid Build Coastguard Worker     } else {
244*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(
245*9356374aSAndroid Build Coastguard Worker           absl::FromCivil(absl::CivilSecond(2013, 11, 0, 18, 30, 27), tz));
246*9356374aSAndroid Build Coastguard Worker     }
247*9356374aSAndroid Build Coastguard Worker     ++i;
248*9356374aSAndroid Build Coastguard Worker   }
249*9356374aSAndroid Build Coastguard Worker }
250*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_FromCivilDay0_Absl);
251*9356374aSAndroid Build Coastguard Worker 
BM_Time_FromCivilDay0_Libc(benchmark::State & state)252*9356374aSAndroid Build Coastguard Worker void BM_Time_FromCivilDay0_Libc(benchmark::State& state) {
253*9356374aSAndroid Build Coastguard Worker   // No timezone support, so just use localtime.
254*9356374aSAndroid Build Coastguard Worker   int i = 0;
255*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
256*9356374aSAndroid Build Coastguard Worker     struct tm tm;
257*9356374aSAndroid Build Coastguard Worker     if ((i & 1) == 0) {
258*9356374aSAndroid Build Coastguard Worker       tm.tm_year = 2014 - 1900;
259*9356374aSAndroid Build Coastguard Worker       tm.tm_mon = 12 - 1;
260*9356374aSAndroid Build Coastguard Worker       tm.tm_mday = 0;
261*9356374aSAndroid Build Coastguard Worker       tm.tm_hour = 20;
262*9356374aSAndroid Build Coastguard Worker       tm.tm_min = 16;
263*9356374aSAndroid Build Coastguard Worker       tm.tm_sec = 18;
264*9356374aSAndroid Build Coastguard Worker     } else {
265*9356374aSAndroid Build Coastguard Worker       tm.tm_year = 2013 - 1900;
266*9356374aSAndroid Build Coastguard Worker       tm.tm_mon = 11 - 1;
267*9356374aSAndroid Build Coastguard Worker       tm.tm_mday = 0;
268*9356374aSAndroid Build Coastguard Worker       tm.tm_hour = 18;
269*9356374aSAndroid Build Coastguard Worker       tm.tm_min = 30;
270*9356374aSAndroid Build Coastguard Worker       tm.tm_sec = 27;
271*9356374aSAndroid Build Coastguard Worker     }
272*9356374aSAndroid Build Coastguard Worker     tm.tm_isdst = -1;
273*9356374aSAndroid Build Coastguard Worker     mktime(&tm);
274*9356374aSAndroid Build Coastguard Worker     ++i;
275*9356374aSAndroid Build Coastguard Worker   }
276*9356374aSAndroid Build Coastguard Worker }
277*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_FromCivilDay0_Libc);
278*9356374aSAndroid Build Coastguard Worker 
279*9356374aSAndroid Build Coastguard Worker //
280*9356374aSAndroid Build Coastguard Worker // To/FromTimespec
281*9356374aSAndroid Build Coastguard Worker //
282*9356374aSAndroid Build Coastguard Worker 
BM_Time_ToTimespec(benchmark::State & state)283*9356374aSAndroid Build Coastguard Worker void BM_Time_ToTimespec(benchmark::State& state) {
284*9356374aSAndroid Build Coastguard Worker   absl::Time now = absl::Now();
285*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
286*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(absl::ToTimespec(now));
287*9356374aSAndroid Build Coastguard Worker   }
288*9356374aSAndroid Build Coastguard Worker }
289*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_ToTimespec);
290*9356374aSAndroid Build Coastguard Worker 
BM_Time_FromTimespec(benchmark::State & state)291*9356374aSAndroid Build Coastguard Worker void BM_Time_FromTimespec(benchmark::State& state) {
292*9356374aSAndroid Build Coastguard Worker   timespec ts = absl::ToTimespec(absl::Now());
293*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
294*9356374aSAndroid Build Coastguard Worker     if (++ts.tv_nsec == 1000 * 1000 * 1000) {
295*9356374aSAndroid Build Coastguard Worker       ++ts.tv_sec;
296*9356374aSAndroid Build Coastguard Worker       ts.tv_nsec = 0;
297*9356374aSAndroid Build Coastguard Worker     }
298*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(absl::TimeFromTimespec(ts));
299*9356374aSAndroid Build Coastguard Worker   }
300*9356374aSAndroid Build Coastguard Worker }
301*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_FromTimespec);
302*9356374aSAndroid Build Coastguard Worker 
303*9356374aSAndroid Build Coastguard Worker //
304*9356374aSAndroid Build Coastguard Worker // Comparison with InfiniteFuture/Past
305*9356374aSAndroid Build Coastguard Worker //
306*9356374aSAndroid Build Coastguard Worker 
BM_Time_InfiniteFuture(benchmark::State & state)307*9356374aSAndroid Build Coastguard Worker void BM_Time_InfiniteFuture(benchmark::State& state) {
308*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
309*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(absl::InfiniteFuture());
310*9356374aSAndroid Build Coastguard Worker   }
311*9356374aSAndroid Build Coastguard Worker }
312*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_InfiniteFuture);
313*9356374aSAndroid Build Coastguard Worker 
BM_Time_InfinitePast(benchmark::State & state)314*9356374aSAndroid Build Coastguard Worker void BM_Time_InfinitePast(benchmark::State& state) {
315*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunning()) {
316*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(absl::InfinitePast());
317*9356374aSAndroid Build Coastguard Worker   }
318*9356374aSAndroid Build Coastguard Worker }
319*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_Time_InfinitePast);
320*9356374aSAndroid Build Coastguard Worker 
321*9356374aSAndroid Build Coastguard Worker }  // namespace
322