xref: /aosp_15_r20/system/unwinding/libunwindstack/benchmarks/main.cpp (revision eb293b8f56ee8303637c5595cfcdeef8039e85c6)
1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*eb293b8fSAndroid Build Coastguard Worker  *
4*eb293b8fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*eb293b8fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*eb293b8fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*eb293b8fSAndroid Build Coastguard Worker  *
8*eb293b8fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*eb293b8fSAndroid Build Coastguard Worker  *
10*eb293b8fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*eb293b8fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*eb293b8fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*eb293b8fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*eb293b8fSAndroid Build Coastguard Worker  * limitations under the License.
15*eb293b8fSAndroid Build Coastguard Worker  */
16*eb293b8fSAndroid Build Coastguard Worker 
17*eb293b8fSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
18*eb293b8fSAndroid Build Coastguard Worker 
19*eb293b8fSAndroid Build Coastguard Worker #include <limits.h>
20*eb293b8fSAndroid Build Coastguard Worker #include <stdio.h>
21*eb293b8fSAndroid Build Coastguard Worker #include <stdlib.h>
22*eb293b8fSAndroid Build Coastguard Worker 
23*eb293b8fSAndroid Build Coastguard Worker #include <android-base/strings.h>
24*eb293b8fSAndroid Build Coastguard Worker 
25*eb293b8fSAndroid Build Coastguard Worker #include <string>
26*eb293b8fSAndroid Build Coastguard Worker #include <vector>
27*eb293b8fSAndroid Build Coastguard Worker 
28*eb293b8fSAndroid Build Coastguard Worker #if defined(__APPLE__)
29*eb293b8fSAndroid Build Coastguard Worker 
30*eb293b8fSAndroid Build Coastguard Worker // Darwin doesn't support this, so do nothing.
LockToCPU(int)31*eb293b8fSAndroid Build Coastguard Worker bool LockToCPU(int) {
32*eb293b8fSAndroid Build Coastguard Worker   return false;
33*eb293b8fSAndroid Build Coastguard Worker }
34*eb293b8fSAndroid Build Coastguard Worker 
35*eb293b8fSAndroid Build Coastguard Worker #else
36*eb293b8fSAndroid Build Coastguard Worker 
37*eb293b8fSAndroid Build Coastguard Worker #include <errno.h>
38*eb293b8fSAndroid Build Coastguard Worker #include <sched.h>
39*eb293b8fSAndroid Build Coastguard Worker 
LockToCPU(int lock_cpu)40*eb293b8fSAndroid Build Coastguard Worker bool LockToCPU(int lock_cpu) {
41*eb293b8fSAndroid Build Coastguard Worker   cpu_set_t cpuset;
42*eb293b8fSAndroid Build Coastguard Worker 
43*eb293b8fSAndroid Build Coastguard Worker   CPU_ZERO(&cpuset);
44*eb293b8fSAndroid Build Coastguard Worker   CPU_SET(lock_cpu, &cpuset);
45*eb293b8fSAndroid Build Coastguard Worker   if (sched_setaffinity(0, sizeof(cpuset), &cpuset) != 0) {
46*eb293b8fSAndroid Build Coastguard Worker     if (errno == EINVAL) {
47*eb293b8fSAndroid Build Coastguard Worker       printf("Invalid cpu %d\n", lock_cpu);
48*eb293b8fSAndroid Build Coastguard Worker     } else {
49*eb293b8fSAndroid Build Coastguard Worker       perror("sched_setaffinity failed");
50*eb293b8fSAndroid Build Coastguard Worker     }
51*eb293b8fSAndroid Build Coastguard Worker     return false;
52*eb293b8fSAndroid Build Coastguard Worker   }
53*eb293b8fSAndroid Build Coastguard Worker 
54*eb293b8fSAndroid Build Coastguard Worker   printf("Locked to cpu %d\n", lock_cpu);
55*eb293b8fSAndroid Build Coastguard Worker   return true;
56*eb293b8fSAndroid Build Coastguard Worker }
57*eb293b8fSAndroid Build Coastguard Worker 
58*eb293b8fSAndroid Build Coastguard Worker #endif
59*eb293b8fSAndroid Build Coastguard Worker 
main(int argc,char ** argv)60*eb293b8fSAndroid Build Coastguard Worker int main(int argc, char** argv) {
61*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__)
62*eb293b8fSAndroid Build Coastguard Worker   // Enable decay time option to allow frees to run faster at the cost of slightly increasing RSS.
63*eb293b8fSAndroid Build Coastguard Worker   // All applications on Android run with this option enabled.
64*eb293b8fSAndroid Build Coastguard Worker   mallopt(M_DECAY_TIME, 1);
65*eb293b8fSAndroid Build Coastguard Worker #endif
66*eb293b8fSAndroid Build Coastguard Worker   std::vector<char*> new_argv;
67*eb293b8fSAndroid Build Coastguard Worker   // The first argument is not an option, so add it as is.
68*eb293b8fSAndroid Build Coastguard Worker   new_argv.push_back(argv[0]);
69*eb293b8fSAndroid Build Coastguard Worker 
70*eb293b8fSAndroid Build Coastguard Worker   // Look for the special option --benchmark_lock_cpu.
71*eb293b8fSAndroid Build Coastguard Worker   int lock_cpu = -1;
72*eb293b8fSAndroid Build Coastguard Worker   for (int i = 1; i < argc; i++) {
73*eb293b8fSAndroid Build Coastguard Worker     if (android::base::StartsWith(argv[i], "--benchmark_cpu=")) {
74*eb293b8fSAndroid Build Coastguard Worker       char* endptr;
75*eb293b8fSAndroid Build Coastguard Worker       long cpu = strtol(&argv[i][16], &endptr, 10);
76*eb293b8fSAndroid Build Coastguard Worker       if (endptr == nullptr || *endptr != '\0' || cpu > INT_MAX || cpu < 0) {
77*eb293b8fSAndroid Build Coastguard Worker         printf("Malformed value for --benchmark_cpu, requires a valid positive number.\n");
78*eb293b8fSAndroid Build Coastguard Worker         return 1;
79*eb293b8fSAndroid Build Coastguard Worker       }
80*eb293b8fSAndroid Build Coastguard Worker       lock_cpu = cpu;
81*eb293b8fSAndroid Build Coastguard Worker     } else {
82*eb293b8fSAndroid Build Coastguard Worker       new_argv.push_back(argv[i]);
83*eb293b8fSAndroid Build Coastguard Worker     }
84*eb293b8fSAndroid Build Coastguard Worker   }
85*eb293b8fSAndroid Build Coastguard Worker   new_argv.push_back(nullptr);
86*eb293b8fSAndroid Build Coastguard Worker 
87*eb293b8fSAndroid Build Coastguard Worker   if (lock_cpu != -1 && !LockToCPU(lock_cpu)) {
88*eb293b8fSAndroid Build Coastguard Worker     return 1;
89*eb293b8fSAndroid Build Coastguard Worker   }
90*eb293b8fSAndroid Build Coastguard Worker 
91*eb293b8fSAndroid Build Coastguard Worker   int new_argc = new_argv.size() - 1;
92*eb293b8fSAndroid Build Coastguard Worker   ::benchmark::Initialize(&new_argc, new_argv.data());
93*eb293b8fSAndroid Build Coastguard Worker   if (::benchmark::ReportUnrecognizedArguments(new_argc, new_argv.data())) return 1;
94*eb293b8fSAndroid Build Coastguard Worker   ::benchmark::RunSpecifiedBenchmarks();
95*eb293b8fSAndroid Build Coastguard Worker }
96