xref: /aosp_15_r20/bionic/benchmarks/time_benchmark.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  *
4*8d67ca89SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8d67ca89SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8d67ca89SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8d67ca89SAndroid Build Coastguard Worker  *
8*8d67ca89SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8d67ca89SAndroid Build Coastguard Worker  *
10*8d67ca89SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8d67ca89SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8d67ca89SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8d67ca89SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8d67ca89SAndroid Build Coastguard Worker  * limitations under the License.
15*8d67ca89SAndroid Build Coastguard Worker  */
16*8d67ca89SAndroid Build Coastguard Worker 
17*8d67ca89SAndroid Build Coastguard Worker #include <sys/syscall.h>
18*8d67ca89SAndroid Build Coastguard Worker #include <sys/time.h>
19*8d67ca89SAndroid Build Coastguard Worker #include <time.h>
20*8d67ca89SAndroid Build Coastguard Worker #include <unistd.h>
21*8d67ca89SAndroid Build Coastguard Worker 
22*8d67ca89SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
23*8d67ca89SAndroid Build Coastguard Worker #include "util.h"
24*8d67ca89SAndroid Build Coastguard Worker 
25*8d67ca89SAndroid Build Coastguard Worker // Musl doesn't define __NR_gettimeofday, __NR_clock_gettime32, __NR_gettimeofday_time32 or
26*8d67ca89SAndroid Build Coastguard Worker // __NR_clock_getres on 32-bit architectures.
27*8d67ca89SAndroid Build Coastguard Worker #if !defined(__NR_gettimeofday)
28*8d67ca89SAndroid Build Coastguard Worker #define __NR_gettimeofday __NR_gettimeofday_time32
29*8d67ca89SAndroid Build Coastguard Worker #endif
30*8d67ca89SAndroid Build Coastguard Worker #if !defined(__NR_clock_gettime)
31*8d67ca89SAndroid Build Coastguard Worker #define __NR_clock_gettime __NR_clock_gettime32
32*8d67ca89SAndroid Build Coastguard Worker #endif
33*8d67ca89SAndroid Build Coastguard Worker #if !defined(__NR_gettimeofday)
34*8d67ca89SAndroid Build Coastguard Worker #define __NR_gettimeofday __NR_gettimeofday_time32
35*8d67ca89SAndroid Build Coastguard Worker #endif
36*8d67ca89SAndroid Build Coastguard Worker #if !defined(__NR_clock_getres)
37*8d67ca89SAndroid Build Coastguard Worker #define __NR_clock_getres __NR_clock_getres_time32
38*8d67ca89SAndroid Build Coastguard Worker #endif
39*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_gettime(benchmark::State & state)40*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_gettime(benchmark::State& state) {
41*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_MONOTONIC is required supported in vdso
42*8d67ca89SAndroid Build Coastguard Worker   timespec t;
43*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
44*8d67ca89SAndroid Build Coastguard Worker     clock_gettime(CLOCK_MONOTONIC, &t);
45*8d67ca89SAndroid Build Coastguard Worker   }
46*8d67ca89SAndroid Build Coastguard Worker }
47*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_gettime);
48*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_gettime_syscall(benchmark::State & state)49*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_gettime_syscall(benchmark::State& state) {
50*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_MONOTONIC is required supported in vdso
51*8d67ca89SAndroid Build Coastguard Worker   timespec t;
52*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
53*8d67ca89SAndroid Build Coastguard Worker     syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &t);
54*8d67ca89SAndroid Build Coastguard Worker   }
55*8d67ca89SAndroid Build Coastguard Worker }
56*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_gettime_syscall);
57*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_gettime_MONOTONIC_COARSE(benchmark::State & state)58*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_gettime_MONOTONIC_COARSE(benchmark::State& state) {
59*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_MONOTONIC_COARSE is required supported in vdso
60*8d67ca89SAndroid Build Coastguard Worker   timespec t;
61*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
62*8d67ca89SAndroid Build Coastguard Worker     clock_gettime(CLOCK_MONOTONIC_COARSE, &t);
63*8d67ca89SAndroid Build Coastguard Worker   }
64*8d67ca89SAndroid Build Coastguard Worker }
65*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_gettime_MONOTONIC_COARSE);
66*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_gettime_MONOTONIC_RAW(benchmark::State & state)67*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_gettime_MONOTONIC_RAW(benchmark::State& state) {
68*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_MONOTONIC_RAW is required supported in vdso
69*8d67ca89SAndroid Build Coastguard Worker   timespec t;
70*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
71*8d67ca89SAndroid Build Coastguard Worker     clock_gettime(CLOCK_MONOTONIC_RAW, &t);
72*8d67ca89SAndroid Build Coastguard Worker   }
73*8d67ca89SAndroid Build Coastguard Worker }
74*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_gettime_MONOTONIC_RAW);
75*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_gettime_REALTIME(benchmark::State & state)76*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_gettime_REALTIME(benchmark::State& state) {
77*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_REALTIME is required supported in vdso
78*8d67ca89SAndroid Build Coastguard Worker   timespec t;
79*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
80*8d67ca89SAndroid Build Coastguard Worker     clock_gettime(CLOCK_REALTIME, &t);
81*8d67ca89SAndroid Build Coastguard Worker   }
82*8d67ca89SAndroid Build Coastguard Worker }
83*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_gettime_REALTIME);
84*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_gettime_REALTIME_COARSE(benchmark::State & state)85*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_gettime_REALTIME_COARSE(benchmark::State& state) {
86*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_REALTIME_COARSE is required supported in vdso
87*8d67ca89SAndroid Build Coastguard Worker   timespec t;
88*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
89*8d67ca89SAndroid Build Coastguard Worker     clock_gettime(CLOCK_REALTIME_COARSE, &t);
90*8d67ca89SAndroid Build Coastguard Worker   }
91*8d67ca89SAndroid Build Coastguard Worker }
92*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_gettime_REALTIME_COARSE);
93*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_gettime_BOOTTIME(benchmark::State & state)94*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_gettime_BOOTTIME(benchmark::State& state) {
95*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_BOOTTIME is optionally supported in vdso
96*8d67ca89SAndroid Build Coastguard Worker   timespec t;
97*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
98*8d67ca89SAndroid Build Coastguard Worker     clock_gettime(CLOCK_BOOTTIME, &t);
99*8d67ca89SAndroid Build Coastguard Worker   }
100*8d67ca89SAndroid Build Coastguard Worker }
101*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_gettime_BOOTTIME);
102*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_getres(benchmark::State & state)103*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_getres(benchmark::State& state) {
104*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_MONOTONIC is required supported in vdso
105*8d67ca89SAndroid Build Coastguard Worker   timespec t;
106*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
107*8d67ca89SAndroid Build Coastguard Worker     clock_getres(CLOCK_MONOTONIC, &t);
108*8d67ca89SAndroid Build Coastguard Worker   }
109*8d67ca89SAndroid Build Coastguard Worker }
110*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_getres);
111*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_getres_syscall(benchmark::State & state)112*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_getres_syscall(benchmark::State& state) {
113*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_MONOTONIC is required supported in vdso
114*8d67ca89SAndroid Build Coastguard Worker   timespec t;
115*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
116*8d67ca89SAndroid Build Coastguard Worker     syscall(__NR_clock_getres, CLOCK_MONOTONIC, &t);
117*8d67ca89SAndroid Build Coastguard Worker   }
118*8d67ca89SAndroid Build Coastguard Worker }
119*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_getres_syscall);
120*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_getres_MONOTONIC_COARSE(benchmark::State & state)121*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_getres_MONOTONIC_COARSE(benchmark::State& state) {
122*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_MONOTONIC_COARSE is required supported in vdso
123*8d67ca89SAndroid Build Coastguard Worker   timespec t;
124*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
125*8d67ca89SAndroid Build Coastguard Worker     clock_getres(CLOCK_MONOTONIC_COARSE, &t);
126*8d67ca89SAndroid Build Coastguard Worker   }
127*8d67ca89SAndroid Build Coastguard Worker }
128*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_getres_MONOTONIC_COARSE);
129*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_getres_MONOTONIC_RAW(benchmark::State & state)130*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_getres_MONOTONIC_RAW(benchmark::State& state) {
131*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_MONOTONIC_RAW is required supported in vdso
132*8d67ca89SAndroid Build Coastguard Worker   timespec t;
133*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
134*8d67ca89SAndroid Build Coastguard Worker     clock_getres(CLOCK_MONOTONIC_RAW, &t);
135*8d67ca89SAndroid Build Coastguard Worker   }
136*8d67ca89SAndroid Build Coastguard Worker }
137*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_getres_MONOTONIC_RAW);
138*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_getres_REALTIME(benchmark::State & state)139*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_getres_REALTIME(benchmark::State& state) {
140*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_REALTIME is required supported in vdso
141*8d67ca89SAndroid Build Coastguard Worker   timespec t;
142*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
143*8d67ca89SAndroid Build Coastguard Worker     clock_getres(CLOCK_REALTIME, &t);
144*8d67ca89SAndroid Build Coastguard Worker   }
145*8d67ca89SAndroid Build Coastguard Worker }
146*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_getres_REALTIME);
147*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_getres_REALTIME_COARSE(benchmark::State & state)148*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_getres_REALTIME_COARSE(benchmark::State& state) {
149*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_REALTIME_COARSE is required supported in vdso
150*8d67ca89SAndroid Build Coastguard Worker   timespec t;
151*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
152*8d67ca89SAndroid Build Coastguard Worker     clock_getres(CLOCK_REALTIME_COARSE, &t);
153*8d67ca89SAndroid Build Coastguard Worker   }
154*8d67ca89SAndroid Build Coastguard Worker }
155*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_getres_REALTIME_COARSE);
156*8d67ca89SAndroid Build Coastguard Worker 
BM_time_clock_getres_BOOTTIME(benchmark::State & state)157*8d67ca89SAndroid Build Coastguard Worker static void BM_time_clock_getres_BOOTTIME(benchmark::State& state) {
158*8d67ca89SAndroid Build Coastguard Worker   // CLOCK_BOOTTIME is optionally supported in vdso
159*8d67ca89SAndroid Build Coastguard Worker   timespec t;
160*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
161*8d67ca89SAndroid Build Coastguard Worker     clock_getres(CLOCK_BOOTTIME, &t);
162*8d67ca89SAndroid Build Coastguard Worker   }
163*8d67ca89SAndroid Build Coastguard Worker }
164*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_clock_getres_BOOTTIME);
165*8d67ca89SAndroid Build Coastguard Worker 
BM_time_gettimeofday(benchmark::State & state)166*8d67ca89SAndroid Build Coastguard Worker static void BM_time_gettimeofday(benchmark::State& state) {
167*8d67ca89SAndroid Build Coastguard Worker   timeval tv;
168*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
169*8d67ca89SAndroid Build Coastguard Worker     gettimeofday(&tv, nullptr);
170*8d67ca89SAndroid Build Coastguard Worker   }
171*8d67ca89SAndroid Build Coastguard Worker }
172*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_gettimeofday);
173*8d67ca89SAndroid Build Coastguard Worker 
BM_time_gettimeofday_syscall(benchmark::State & state)174*8d67ca89SAndroid Build Coastguard Worker void BM_time_gettimeofday_syscall(benchmark::State& state) {
175*8d67ca89SAndroid Build Coastguard Worker   timeval tv;
176*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
177*8d67ca89SAndroid Build Coastguard Worker     syscall(__NR_gettimeofday, &tv, nullptr);
178*8d67ca89SAndroid Build Coastguard Worker   }
179*8d67ca89SAndroid Build Coastguard Worker }
180*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_gettimeofday_syscall);
181*8d67ca89SAndroid Build Coastguard Worker 
BM_time_time(benchmark::State & state)182*8d67ca89SAndroid Build Coastguard Worker void BM_time_time(benchmark::State& state) {
183*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
184*8d67ca89SAndroid Build Coastguard Worker     time(nullptr);
185*8d67ca89SAndroid Build Coastguard Worker   }
186*8d67ca89SAndroid Build Coastguard Worker }
187*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_time);
188*8d67ca89SAndroid Build Coastguard Worker 
BM_time_localtime(benchmark::State & state)189*8d67ca89SAndroid Build Coastguard Worker void BM_time_localtime(benchmark::State& state) {
190*8d67ca89SAndroid Build Coastguard Worker   time_t t = time(nullptr);
191*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
192*8d67ca89SAndroid Build Coastguard Worker     localtime(&t);
193*8d67ca89SAndroid Build Coastguard Worker   }
194*8d67ca89SAndroid Build Coastguard Worker }
195*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_localtime);
196*8d67ca89SAndroid Build Coastguard Worker 
BM_time_localtime_r(benchmark::State & state)197*8d67ca89SAndroid Build Coastguard Worker void BM_time_localtime_r(benchmark::State& state) {
198*8d67ca89SAndroid Build Coastguard Worker   time_t t = time(nullptr);
199*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
200*8d67ca89SAndroid Build Coastguard Worker     struct tm tm;
201*8d67ca89SAndroid Build Coastguard Worker     localtime_r(&t, &tm);
202*8d67ca89SAndroid Build Coastguard Worker   }
203*8d67ca89SAndroid Build Coastguard Worker }
204*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_localtime_r);
205*8d67ca89SAndroid Build Coastguard Worker 
BM_time_strftime(benchmark::State & state)206*8d67ca89SAndroid Build Coastguard Worker void BM_time_strftime(benchmark::State& state) {
207*8d67ca89SAndroid Build Coastguard Worker   char buf[128];
208*8d67ca89SAndroid Build Coastguard Worker   time_t t = 0;
209*8d67ca89SAndroid Build Coastguard Worker   struct tm* tm = gmtime(&t);
210*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
211*8d67ca89SAndroid Build Coastguard Worker     strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm);
212*8d67ca89SAndroid Build Coastguard Worker   }
213*8d67ca89SAndroid Build Coastguard Worker }
214*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK(BM_time_strftime);
215