xref: /aosp_15_r20/system/extras/memory_replay/TraceBenchmark.cpp (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker /*
2*288bf522SAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker  *
4*288bf522SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker  *
8*288bf522SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker  *
10*288bf522SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker  * limitations under the License.
15*288bf522SAndroid Build Coastguard Worker  */
16*288bf522SAndroid Build Coastguard Worker 
17*288bf522SAndroid Build Coastguard Worker #include <err.h>
18*288bf522SAndroid Build Coastguard Worker #include <inttypes.h>
19*288bf522SAndroid Build Coastguard Worker #include <malloc.h>
20*288bf522SAndroid Build Coastguard Worker #include <sched.h>
21*288bf522SAndroid Build Coastguard Worker #include <stdint.h>
22*288bf522SAndroid Build Coastguard Worker #include <stdio.h>
23*288bf522SAndroid Build Coastguard Worker #include <stdlib.h>
24*288bf522SAndroid Build Coastguard Worker #include <string.h>
25*288bf522SAndroid Build Coastguard Worker #include <sys/mman.h>
26*288bf522SAndroid Build Coastguard Worker #include <unistd.h>
27*288bf522SAndroid Build Coastguard Worker 
28*288bf522SAndroid Build Coastguard Worker #include <algorithm>
29*288bf522SAndroid Build Coastguard Worker #include <stack>
30*288bf522SAndroid Build Coastguard Worker #include <string>
31*288bf522SAndroid Build Coastguard Worker #include <unordered_map>
32*288bf522SAndroid Build Coastguard Worker #include <vector>
33*288bf522SAndroid Build Coastguard Worker 
34*288bf522SAndroid Build Coastguard Worker #include <android-base/file.h>
35*288bf522SAndroid Build Coastguard Worker #include <android-base/strings.h>
36*288bf522SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
37*288bf522SAndroid Build Coastguard Worker 
38*288bf522SAndroid Build Coastguard Worker #include <memory_trace/MemoryTrace.h>
39*288bf522SAndroid Build Coastguard Worker 
40*288bf522SAndroid Build Coastguard Worker #include "File.h"
41*288bf522SAndroid Build Coastguard Worker #include "Utils.h"
42*288bf522SAndroid Build Coastguard Worker 
43*288bf522SAndroid Build Coastguard Worker struct TraceDataType {
44*288bf522SAndroid Build Coastguard Worker   memory_trace::Entry* entries = nullptr;
45*288bf522SAndroid Build Coastguard Worker   size_t num_entries = 0;
46*288bf522SAndroid Build Coastguard Worker   void** ptrs = nullptr;
47*288bf522SAndroid Build Coastguard Worker   size_t num_ptrs = 0;
48*288bf522SAndroid Build Coastguard Worker };
49*288bf522SAndroid Build Coastguard Worker 
GetIndex(std::stack<size_t> & free_indices,size_t * max_index)50*288bf522SAndroid Build Coastguard Worker static size_t GetIndex(std::stack<size_t>& free_indices, size_t* max_index) {
51*288bf522SAndroid Build Coastguard Worker   if (free_indices.empty()) {
52*288bf522SAndroid Build Coastguard Worker     return (*max_index)++;
53*288bf522SAndroid Build Coastguard Worker   }
54*288bf522SAndroid Build Coastguard Worker   size_t index = free_indices.top();
55*288bf522SAndroid Build Coastguard Worker   free_indices.pop();
56*288bf522SAndroid Build Coastguard Worker   return index;
57*288bf522SAndroid Build Coastguard Worker }
58*288bf522SAndroid Build Coastguard Worker 
FreePtrs(TraceDataType * trace_data)59*288bf522SAndroid Build Coastguard Worker static void FreePtrs(TraceDataType* trace_data) {
60*288bf522SAndroid Build Coastguard Worker   for (size_t i = 0; i < trace_data->num_ptrs; i++) {
61*288bf522SAndroid Build Coastguard Worker     void* ptr = trace_data->ptrs[i];
62*288bf522SAndroid Build Coastguard Worker     if (ptr != nullptr) {
63*288bf522SAndroid Build Coastguard Worker       free(ptr);
64*288bf522SAndroid Build Coastguard Worker       trace_data->ptrs[i] = nullptr;
65*288bf522SAndroid Build Coastguard Worker     }
66*288bf522SAndroid Build Coastguard Worker   }
67*288bf522SAndroid Build Coastguard Worker }
68*288bf522SAndroid Build Coastguard Worker 
FreeTraceData(TraceDataType * trace_data)69*288bf522SAndroid Build Coastguard Worker static void FreeTraceData(TraceDataType* trace_data) {
70*288bf522SAndroid Build Coastguard Worker   if (trace_data->ptrs == nullptr) {
71*288bf522SAndroid Build Coastguard Worker     return;
72*288bf522SAndroid Build Coastguard Worker   }
73*288bf522SAndroid Build Coastguard Worker 
74*288bf522SAndroid Build Coastguard Worker   munmap(trace_data->ptrs, sizeof(void*) * trace_data->num_ptrs);
75*288bf522SAndroid Build Coastguard Worker   FreeEntries(trace_data->entries, trace_data->num_entries);
76*288bf522SAndroid Build Coastguard Worker }
77*288bf522SAndroid Build Coastguard Worker 
GetTraceData(const std::string & filename,TraceDataType * trace_data)78*288bf522SAndroid Build Coastguard Worker static void GetTraceData(const std::string& filename, TraceDataType* trace_data) {
79*288bf522SAndroid Build Coastguard Worker   // Only keep last trace encountered cached.
80*288bf522SAndroid Build Coastguard Worker   static std::string cached_filename;
81*288bf522SAndroid Build Coastguard Worker   static TraceDataType cached_trace_data;
82*288bf522SAndroid Build Coastguard Worker   if (cached_filename == filename) {
83*288bf522SAndroid Build Coastguard Worker     *trace_data = cached_trace_data;
84*288bf522SAndroid Build Coastguard Worker     return;
85*288bf522SAndroid Build Coastguard Worker   } else {
86*288bf522SAndroid Build Coastguard Worker     FreeTraceData(&cached_trace_data);
87*288bf522SAndroid Build Coastguard Worker   }
88*288bf522SAndroid Build Coastguard Worker 
89*288bf522SAndroid Build Coastguard Worker   cached_filename = filename;
90*288bf522SAndroid Build Coastguard Worker   GetUnwindInfo(filename.c_str(), &trace_data->entries, &trace_data->num_entries);
91*288bf522SAndroid Build Coastguard Worker 
92*288bf522SAndroid Build Coastguard Worker   // This loop will convert the ptr field into an index into the ptrs array.
93*288bf522SAndroid Build Coastguard Worker   // Creating this index allows the trace run to quickly store or retrieve the
94*288bf522SAndroid Build Coastguard Worker   // allocation.
95*288bf522SAndroid Build Coastguard Worker   // For free, the ptr field will be index + one, where a zero represents
96*288bf522SAndroid Build Coastguard Worker   // a free(nullptr) call.
97*288bf522SAndroid Build Coastguard Worker   // For realloc, the old_pointer field will be index + one, where a zero
98*288bf522SAndroid Build Coastguard Worker   // represents a realloc(nullptr, XX).
99*288bf522SAndroid Build Coastguard Worker   trace_data->num_ptrs = 0;
100*288bf522SAndroid Build Coastguard Worker   std::stack<size_t> free_indices;
101*288bf522SAndroid Build Coastguard Worker   std::unordered_map<uint64_t, size_t> ptr_to_index;
102*288bf522SAndroid Build Coastguard Worker   for (size_t i = 0; i < trace_data->num_entries; i++) {
103*288bf522SAndroid Build Coastguard Worker     memory_trace::Entry* entry = &trace_data->entries[i];
104*288bf522SAndroid Build Coastguard Worker     switch (entry->type) {
105*288bf522SAndroid Build Coastguard Worker       case memory_trace::MALLOC:
106*288bf522SAndroid Build Coastguard Worker       case memory_trace::CALLOC:
107*288bf522SAndroid Build Coastguard Worker       case memory_trace::MEMALIGN: {
108*288bf522SAndroid Build Coastguard Worker         size_t idx = GetIndex(free_indices, &trace_data->num_ptrs);
109*288bf522SAndroid Build Coastguard Worker         ptr_to_index[entry->ptr] = idx;
110*288bf522SAndroid Build Coastguard Worker         entry->ptr = idx;
111*288bf522SAndroid Build Coastguard Worker         break;
112*288bf522SAndroid Build Coastguard Worker       }
113*288bf522SAndroid Build Coastguard Worker       case memory_trace::REALLOC: {
114*288bf522SAndroid Build Coastguard Worker         if (entry->u.old_ptr != 0) {
115*288bf522SAndroid Build Coastguard Worker           auto idx_entry = ptr_to_index.find(entry->u.old_ptr);
116*288bf522SAndroid Build Coastguard Worker           if (idx_entry == ptr_to_index.end()) {
117*288bf522SAndroid Build Coastguard Worker             errx(1, "File Error: Failed to find realloc pointer %" PRIx64, entry->u.old_ptr);
118*288bf522SAndroid Build Coastguard Worker           }
119*288bf522SAndroid Build Coastguard Worker           size_t old_pointer_idx = idx_entry->second;
120*288bf522SAndroid Build Coastguard Worker           free_indices.push(old_pointer_idx);
121*288bf522SAndroid Build Coastguard Worker           ptr_to_index.erase(idx_entry);
122*288bf522SAndroid Build Coastguard Worker           entry->u.old_ptr = old_pointer_idx + 1;
123*288bf522SAndroid Build Coastguard Worker         }
124*288bf522SAndroid Build Coastguard Worker         size_t idx = GetIndex(free_indices, &trace_data->num_ptrs);
125*288bf522SAndroid Build Coastguard Worker         ptr_to_index[entry->ptr] = idx;
126*288bf522SAndroid Build Coastguard Worker         entry->ptr = idx;
127*288bf522SAndroid Build Coastguard Worker         break;
128*288bf522SAndroid Build Coastguard Worker       }
129*288bf522SAndroid Build Coastguard Worker       case memory_trace::FREE:
130*288bf522SAndroid Build Coastguard Worker         if (entry->ptr != 0) {
131*288bf522SAndroid Build Coastguard Worker           auto idx_entry = ptr_to_index.find(entry->ptr);
132*288bf522SAndroid Build Coastguard Worker           if (idx_entry == ptr_to_index.end()) {
133*288bf522SAndroid Build Coastguard Worker             errx(1, "File Error: Unable to find free pointer %" PRIx64, entry->ptr);
134*288bf522SAndroid Build Coastguard Worker           }
135*288bf522SAndroid Build Coastguard Worker           free_indices.push(idx_entry->second);
136*288bf522SAndroid Build Coastguard Worker           entry->ptr = idx_entry->second + 1;
137*288bf522SAndroid Build Coastguard Worker           ptr_to_index.erase(idx_entry);
138*288bf522SAndroid Build Coastguard Worker         }
139*288bf522SAndroid Build Coastguard Worker         break;
140*288bf522SAndroid Build Coastguard Worker       case memory_trace::THREAD_DONE:
141*288bf522SAndroid Build Coastguard Worker         break;
142*288bf522SAndroid Build Coastguard Worker     }
143*288bf522SAndroid Build Coastguard Worker   }
144*288bf522SAndroid Build Coastguard Worker   void* map = mmap(nullptr, sizeof(void*) * trace_data->num_ptrs, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
145*288bf522SAndroid Build Coastguard Worker   if (map == MAP_FAILED) {
146*288bf522SAndroid Build Coastguard Worker     err(1, "mmap failed");
147*288bf522SAndroid Build Coastguard Worker   }
148*288bf522SAndroid Build Coastguard Worker   trace_data->ptrs = reinterpret_cast<void**>(map);
149*288bf522SAndroid Build Coastguard Worker 
150*288bf522SAndroid Build Coastguard Worker   cached_trace_data = *trace_data;
151*288bf522SAndroid Build Coastguard Worker }
152*288bf522SAndroid Build Coastguard Worker 
RunTrace(benchmark::State & state,TraceDataType * trace_data)153*288bf522SAndroid Build Coastguard Worker static void RunTrace(benchmark::State& state, TraceDataType* trace_data) {
154*288bf522SAndroid Build Coastguard Worker   int pagesize = getpagesize();
155*288bf522SAndroid Build Coastguard Worker   uint64_t total_ns = 0;
156*288bf522SAndroid Build Coastguard Worker   uint64_t start_ns;
157*288bf522SAndroid Build Coastguard Worker   void** ptrs = trace_data->ptrs;
158*288bf522SAndroid Build Coastguard Worker   for (size_t i = 0; i < trace_data->num_entries; i++) {
159*288bf522SAndroid Build Coastguard Worker     void* ptr;
160*288bf522SAndroid Build Coastguard Worker     const memory_trace::Entry& entry = trace_data->entries[i];
161*288bf522SAndroid Build Coastguard Worker     switch (entry.type) {
162*288bf522SAndroid Build Coastguard Worker       case memory_trace::MALLOC:
163*288bf522SAndroid Build Coastguard Worker         start_ns = Nanotime();
164*288bf522SAndroid Build Coastguard Worker         ptr = malloc(entry.size);
165*288bf522SAndroid Build Coastguard Worker         if (ptr == nullptr) {
166*288bf522SAndroid Build Coastguard Worker           errx(1, "malloc returned nullptr");
167*288bf522SAndroid Build Coastguard Worker         }
168*288bf522SAndroid Build Coastguard Worker         MakeAllocationResident(ptr, entry.size, pagesize);
169*288bf522SAndroid Build Coastguard Worker         total_ns += Nanotime() - start_ns;
170*288bf522SAndroid Build Coastguard Worker 
171*288bf522SAndroid Build Coastguard Worker         if (ptrs[entry.ptr] != nullptr) {
172*288bf522SAndroid Build Coastguard Worker           errx(1, "Internal Error: malloc pointer being replaced is not nullptr");
173*288bf522SAndroid Build Coastguard Worker         }
174*288bf522SAndroid Build Coastguard Worker         ptrs[entry.ptr] = ptr;
175*288bf522SAndroid Build Coastguard Worker         break;
176*288bf522SAndroid Build Coastguard Worker 
177*288bf522SAndroid Build Coastguard Worker       case memory_trace::CALLOC:
178*288bf522SAndroid Build Coastguard Worker         start_ns = Nanotime();
179*288bf522SAndroid Build Coastguard Worker         ptr = calloc(entry.u.n_elements, entry.size);
180*288bf522SAndroid Build Coastguard Worker         if (ptr == nullptr) {
181*288bf522SAndroid Build Coastguard Worker           errx(1, "calloc returned nullptr");
182*288bf522SAndroid Build Coastguard Worker         }
183*288bf522SAndroid Build Coastguard Worker         MakeAllocationResident(ptr, entry.size, pagesize);
184*288bf522SAndroid Build Coastguard Worker         total_ns += Nanotime() - start_ns;
185*288bf522SAndroid Build Coastguard Worker 
186*288bf522SAndroid Build Coastguard Worker         if (ptrs[entry.ptr] != nullptr) {
187*288bf522SAndroid Build Coastguard Worker           errx(1, "Internal Error: calloc pointer being replaced is not nullptr");
188*288bf522SAndroid Build Coastguard Worker         }
189*288bf522SAndroid Build Coastguard Worker         ptrs[entry.ptr] = ptr;
190*288bf522SAndroid Build Coastguard Worker         break;
191*288bf522SAndroid Build Coastguard Worker 
192*288bf522SAndroid Build Coastguard Worker       case memory_trace::MEMALIGN:
193*288bf522SAndroid Build Coastguard Worker         start_ns = Nanotime();
194*288bf522SAndroid Build Coastguard Worker         ptr = memalign(entry.u.align, entry.size);
195*288bf522SAndroid Build Coastguard Worker         if (ptr == nullptr) {
196*288bf522SAndroid Build Coastguard Worker           errx(1, "memalign returned nullptr");
197*288bf522SAndroid Build Coastguard Worker         }
198*288bf522SAndroid Build Coastguard Worker         MakeAllocationResident(ptr, entry.size, pagesize);
199*288bf522SAndroid Build Coastguard Worker         total_ns += Nanotime() - start_ns;
200*288bf522SAndroid Build Coastguard Worker 
201*288bf522SAndroid Build Coastguard Worker         if (ptrs[entry.ptr] != nullptr) {
202*288bf522SAndroid Build Coastguard Worker           errx(1, "Internal Error: memalign pointer being replaced is not nullptr");
203*288bf522SAndroid Build Coastguard Worker         }
204*288bf522SAndroid Build Coastguard Worker         ptrs[entry.ptr] = ptr;
205*288bf522SAndroid Build Coastguard Worker         break;
206*288bf522SAndroid Build Coastguard Worker 
207*288bf522SAndroid Build Coastguard Worker       case memory_trace::REALLOC:
208*288bf522SAndroid Build Coastguard Worker         start_ns = Nanotime();
209*288bf522SAndroid Build Coastguard Worker         if (entry.u.old_ptr == 0) {
210*288bf522SAndroid Build Coastguard Worker           ptr = realloc(nullptr, entry.size);
211*288bf522SAndroid Build Coastguard Worker         } else {
212*288bf522SAndroid Build Coastguard Worker           ptr = realloc(ptrs[entry.u.old_ptr - 1], entry.size);
213*288bf522SAndroid Build Coastguard Worker           ptrs[entry.u.old_ptr - 1] = nullptr;
214*288bf522SAndroid Build Coastguard Worker         }
215*288bf522SAndroid Build Coastguard Worker         if (entry.size > 0) {
216*288bf522SAndroid Build Coastguard Worker           if (ptr == nullptr) {
217*288bf522SAndroid Build Coastguard Worker             errx(1, "realloc returned nullptr");
218*288bf522SAndroid Build Coastguard Worker           }
219*288bf522SAndroid Build Coastguard Worker           MakeAllocationResident(ptr, entry.size, pagesize);
220*288bf522SAndroid Build Coastguard Worker         }
221*288bf522SAndroid Build Coastguard Worker         total_ns += Nanotime() - start_ns;
222*288bf522SAndroid Build Coastguard Worker 
223*288bf522SAndroid Build Coastguard Worker         if (ptrs[entry.ptr] != nullptr) {
224*288bf522SAndroid Build Coastguard Worker           errx(1, "Internal Error: realloc pointer being replaced is not nullptr");
225*288bf522SAndroid Build Coastguard Worker         }
226*288bf522SAndroid Build Coastguard Worker         ptrs[entry.ptr] = ptr;
227*288bf522SAndroid Build Coastguard Worker         break;
228*288bf522SAndroid Build Coastguard Worker 
229*288bf522SAndroid Build Coastguard Worker       case memory_trace::FREE:
230*288bf522SAndroid Build Coastguard Worker         if (entry.ptr != 0) {
231*288bf522SAndroid Build Coastguard Worker           ptr = ptrs[entry.ptr - 1];
232*288bf522SAndroid Build Coastguard Worker           ptrs[entry.ptr - 1] = nullptr;
233*288bf522SAndroid Build Coastguard Worker         } else {
234*288bf522SAndroid Build Coastguard Worker           ptr = nullptr;
235*288bf522SAndroid Build Coastguard Worker         }
236*288bf522SAndroid Build Coastguard Worker         start_ns = Nanotime();
237*288bf522SAndroid Build Coastguard Worker         free(ptr);
238*288bf522SAndroid Build Coastguard Worker         total_ns += Nanotime() - start_ns;
239*288bf522SAndroid Build Coastguard Worker         break;
240*288bf522SAndroid Build Coastguard Worker 
241*288bf522SAndroid Build Coastguard Worker       case memory_trace::THREAD_DONE:
242*288bf522SAndroid Build Coastguard Worker         break;
243*288bf522SAndroid Build Coastguard Worker     }
244*288bf522SAndroid Build Coastguard Worker   }
245*288bf522SAndroid Build Coastguard Worker   state.SetIterationTime(total_ns / double(1000000000.0));
246*288bf522SAndroid Build Coastguard Worker 
247*288bf522SAndroid Build Coastguard Worker   FreePtrs(trace_data);
248*288bf522SAndroid Build Coastguard Worker }
249*288bf522SAndroid Build Coastguard Worker 
250*288bf522SAndroid Build Coastguard Worker // Run a trace as if all of the allocations occurred in a single thread.
251*288bf522SAndroid Build Coastguard Worker // This is not completely realistic, but it is a possible worst case that
252*288bf522SAndroid Build Coastguard Worker // could happen in an app.
BenchmarkTrace(benchmark::State & state,const char * filename,bool enable_decay_time)253*288bf522SAndroid Build Coastguard Worker static void BenchmarkTrace(benchmark::State& state, const char* filename,
254*288bf522SAndroid Build Coastguard Worker                            [[maybe_unused]] bool enable_decay_time) {
255*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
256*288bf522SAndroid Build Coastguard Worker   if (enable_decay_time) {
257*288bf522SAndroid Build Coastguard Worker     mallopt(M_DECAY_TIME, 1);
258*288bf522SAndroid Build Coastguard Worker   } else {
259*288bf522SAndroid Build Coastguard Worker     mallopt(M_DECAY_TIME, 0);
260*288bf522SAndroid Build Coastguard Worker   }
261*288bf522SAndroid Build Coastguard Worker #endif
262*288bf522SAndroid Build Coastguard Worker   std::string full_filename(android::base::GetExecutableDirectory() + "/traces/" + filename);
263*288bf522SAndroid Build Coastguard Worker 
264*288bf522SAndroid Build Coastguard Worker   TraceDataType trace_data;
265*288bf522SAndroid Build Coastguard Worker   GetTraceData(full_filename, &trace_data);
266*288bf522SAndroid Build Coastguard Worker 
267*288bf522SAndroid Build Coastguard Worker   for (auto _ : state) {
268*288bf522SAndroid Build Coastguard Worker     RunTrace(state, &trace_data);
269*288bf522SAndroid Build Coastguard Worker   }
270*288bf522SAndroid Build Coastguard Worker 
271*288bf522SAndroid Build Coastguard Worker   // Don't free the trace_data, it is cached. The last set of trace data
272*288bf522SAndroid Build Coastguard Worker   // will be leaked away.
273*288bf522SAndroid Build Coastguard Worker }
274*288bf522SAndroid Build Coastguard Worker 
275*288bf522SAndroid Build Coastguard Worker #define BENCH_OPTIONS                 \
276*288bf522SAndroid Build Coastguard Worker   UseManualTime()                     \
277*288bf522SAndroid Build Coastguard Worker       ->Unit(benchmark::kMicrosecond) \
278*288bf522SAndroid Build Coastguard Worker       ->MinTime(15.0)                 \
279*288bf522SAndroid Build Coastguard Worker       ->Repetitions(4)                \
280*288bf522SAndroid Build Coastguard Worker       ->ReportAggregatesOnly(true)
281*288bf522SAndroid Build Coastguard Worker 
BM_angry_birds2_default(benchmark::State & state)282*288bf522SAndroid Build Coastguard Worker static void BM_angry_birds2_default(benchmark::State& state) {
283*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "angry_birds2.zip", true);
284*288bf522SAndroid Build Coastguard Worker }
285*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_angry_birds2_default)->BENCH_OPTIONS;
286*288bf522SAndroid Build Coastguard Worker 
287*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_angry_birds2_no_decay(benchmark::State & state)288*288bf522SAndroid Build Coastguard Worker static void BM_angry_birds2_no_decay(benchmark::State& state) {
289*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "angry_birds2.zip", false);
290*288bf522SAndroid Build Coastguard Worker }
291*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_angry_birds2_no_decay)->BENCH_OPTIONS;
292*288bf522SAndroid Build Coastguard Worker #endif
293*288bf522SAndroid Build Coastguard Worker 
BM_camera_default(benchmark::State & state)294*288bf522SAndroid Build Coastguard Worker static void BM_camera_default(benchmark::State& state) {
295*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "camera.zip", true);
296*288bf522SAndroid Build Coastguard Worker }
297*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_camera_default)->BENCH_OPTIONS;
298*288bf522SAndroid Build Coastguard Worker 
299*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_camera_no_decay(benchmark::State & state)300*288bf522SAndroid Build Coastguard Worker static void BM_camera_no_decay(benchmark::State& state) {
301*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "camera.zip", false);
302*288bf522SAndroid Build Coastguard Worker }
303*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_camera_no_decay)->BENCH_OPTIONS;
304*288bf522SAndroid Build Coastguard Worker #endif
305*288bf522SAndroid Build Coastguard Worker 
BM_candy_crush_saga_default(benchmark::State & state)306*288bf522SAndroid Build Coastguard Worker static void BM_candy_crush_saga_default(benchmark::State& state) {
307*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "candy_crush_saga.zip", true);
308*288bf522SAndroid Build Coastguard Worker }
309*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_candy_crush_saga_default)->BENCH_OPTIONS;
310*288bf522SAndroid Build Coastguard Worker 
311*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_candy_crush_saga_no_decay(benchmark::State & state)312*288bf522SAndroid Build Coastguard Worker static void BM_candy_crush_saga_no_decay(benchmark::State& state) {
313*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "candy_crush_saga.zip", false);
314*288bf522SAndroid Build Coastguard Worker }
315*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_candy_crush_saga_no_decay)->BENCH_OPTIONS;
316*288bf522SAndroid Build Coastguard Worker #endif
317*288bf522SAndroid Build Coastguard Worker 
BM_gmail_default(benchmark::State & state)318*288bf522SAndroid Build Coastguard Worker void BM_gmail_default(benchmark::State& state) {
319*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "gmail.zip", true);
320*288bf522SAndroid Build Coastguard Worker }
321*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_gmail_default)->BENCH_OPTIONS;
322*288bf522SAndroid Build Coastguard Worker 
323*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_gmail_no_decay(benchmark::State & state)324*288bf522SAndroid Build Coastguard Worker void BM_gmail_no_decay(benchmark::State& state) {
325*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "gmail.zip", false);
326*288bf522SAndroid Build Coastguard Worker }
327*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_gmail_no_decay)->BENCH_OPTIONS;
328*288bf522SAndroid Build Coastguard Worker #endif
329*288bf522SAndroid Build Coastguard Worker 
BM_maps_default(benchmark::State & state)330*288bf522SAndroid Build Coastguard Worker void BM_maps_default(benchmark::State& state) {
331*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "maps.zip", true);
332*288bf522SAndroid Build Coastguard Worker }
333*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_maps_default)->BENCH_OPTIONS;
334*288bf522SAndroid Build Coastguard Worker 
335*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_maps_no_decay(benchmark::State & state)336*288bf522SAndroid Build Coastguard Worker void BM_maps_no_decay(benchmark::State& state) {
337*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "maps.zip", false);
338*288bf522SAndroid Build Coastguard Worker }
339*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_maps_no_decay)->BENCH_OPTIONS;
340*288bf522SAndroid Build Coastguard Worker #endif
341*288bf522SAndroid Build Coastguard Worker 
BM_photos_default(benchmark::State & state)342*288bf522SAndroid Build Coastguard Worker void BM_photos_default(benchmark::State& state) {
343*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "photos.zip", true);
344*288bf522SAndroid Build Coastguard Worker }
345*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_photos_default)->BENCH_OPTIONS;
346*288bf522SAndroid Build Coastguard Worker 
347*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_photos_no_decay(benchmark::State & state)348*288bf522SAndroid Build Coastguard Worker void BM_photos_no_decay(benchmark::State& state) {
349*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "photos.zip", false);
350*288bf522SAndroid Build Coastguard Worker }
351*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_photos_no_decay)->BENCH_OPTIONS;
352*288bf522SAndroid Build Coastguard Worker #endif
353*288bf522SAndroid Build Coastguard Worker 
BM_pubg_default(benchmark::State & state)354*288bf522SAndroid Build Coastguard Worker void BM_pubg_default(benchmark::State& state) {
355*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "pubg.zip", true);
356*288bf522SAndroid Build Coastguard Worker }
357*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_pubg_default)->BENCH_OPTIONS;
358*288bf522SAndroid Build Coastguard Worker 
359*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_pubg_no_decay(benchmark::State & state)360*288bf522SAndroid Build Coastguard Worker void BM_pubg_no_decay(benchmark::State& state) {
361*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "pubg.zip", false);
362*288bf522SAndroid Build Coastguard Worker }
363*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_pubg_no_decay)->BENCH_OPTIONS;
364*288bf522SAndroid Build Coastguard Worker #endif
365*288bf522SAndroid Build Coastguard Worker 
BM_surfaceflinger_default(benchmark::State & state)366*288bf522SAndroid Build Coastguard Worker void BM_surfaceflinger_default(benchmark::State& state) {
367*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "surfaceflinger.zip", true);
368*288bf522SAndroid Build Coastguard Worker }
369*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_surfaceflinger_default)->BENCH_OPTIONS;
370*288bf522SAndroid Build Coastguard Worker 
371*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_surfaceflinger_no_decay(benchmark::State & state)372*288bf522SAndroid Build Coastguard Worker void BM_surfaceflinger_no_decay(benchmark::State& state) {
373*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "surfaceflinger.zip", false);
374*288bf522SAndroid Build Coastguard Worker }
375*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_surfaceflinger_no_decay)->BENCH_OPTIONS;
376*288bf522SAndroid Build Coastguard Worker #endif
377*288bf522SAndroid Build Coastguard Worker 
BM_system_server_default(benchmark::State & state)378*288bf522SAndroid Build Coastguard Worker void BM_system_server_default(benchmark::State& state) {
379*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "system_server.zip", true);
380*288bf522SAndroid Build Coastguard Worker }
381*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_system_server_default)->BENCH_OPTIONS;
382*288bf522SAndroid Build Coastguard Worker 
383*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_system_server_no_decay(benchmark::State & state)384*288bf522SAndroid Build Coastguard Worker void BM_system_server_no_decay(benchmark::State& state) {
385*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "system_server.zip", false);
386*288bf522SAndroid Build Coastguard Worker }
387*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_system_server_no_decay)->BENCH_OPTIONS;
388*288bf522SAndroid Build Coastguard Worker #endif
389*288bf522SAndroid Build Coastguard Worker 
BM_systemui_default(benchmark::State & state)390*288bf522SAndroid Build Coastguard Worker void BM_systemui_default(benchmark::State& state) {
391*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "systemui.zip", true);
392*288bf522SAndroid Build Coastguard Worker }
393*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_systemui_default)->BENCH_OPTIONS;
394*288bf522SAndroid Build Coastguard Worker 
395*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_systemui_no_decay(benchmark::State & state)396*288bf522SAndroid Build Coastguard Worker void BM_systemui_no_decay(benchmark::State& state) {
397*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "systemui.zip", false);
398*288bf522SAndroid Build Coastguard Worker }
399*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_systemui_no_decay)->BENCH_OPTIONS;
400*288bf522SAndroid Build Coastguard Worker #endif
401*288bf522SAndroid Build Coastguard Worker 
BM_youtube_default(benchmark::State & state)402*288bf522SAndroid Build Coastguard Worker void BM_youtube_default(benchmark::State& state) {
403*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "youtube.zip", true);
404*288bf522SAndroid Build Coastguard Worker }
405*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_youtube_default)->BENCH_OPTIONS;
406*288bf522SAndroid Build Coastguard Worker 
407*288bf522SAndroid Build Coastguard Worker #if defined(__BIONIC__)
BM_youtube_no_decay(benchmark::State & state)408*288bf522SAndroid Build Coastguard Worker void BM_youtube_no_decay(benchmark::State& state) {
409*288bf522SAndroid Build Coastguard Worker   BenchmarkTrace(state, "youtube.zip", false);
410*288bf522SAndroid Build Coastguard Worker }
411*288bf522SAndroid Build Coastguard Worker BENCHMARK(BM_youtube_no_decay)->BENCH_OPTIONS;
412*288bf522SAndroid Build Coastguard Worker #endif
413*288bf522SAndroid Build Coastguard Worker 
main(int argc,char ** argv)414*288bf522SAndroid Build Coastguard Worker int main(int argc, char** argv) {
415*288bf522SAndroid Build Coastguard Worker   std::vector<char*> args;
416*288bf522SAndroid Build Coastguard Worker   args.push_back(argv[0]);
417*288bf522SAndroid Build Coastguard Worker 
418*288bf522SAndroid Build Coastguard Worker   // Look for the --cpu=XX option.
419*288bf522SAndroid Build Coastguard Worker   for (int i = 1; i < argc; i++) {
420*288bf522SAndroid Build Coastguard Worker     if (strncmp(argv[i], "--cpu=", 6) == 0) {
421*288bf522SAndroid Build Coastguard Worker       char* endptr;
422*288bf522SAndroid Build Coastguard Worker       int cpu = strtol(&argv[i][6], &endptr, 10);
423*288bf522SAndroid Build Coastguard Worker       if (argv[i][0] == '\0' || endptr == nullptr || *endptr != '\0') {
424*288bf522SAndroid Build Coastguard Worker         printf("Invalid format of --cpu option, '%s' must be an integer value.\n", argv[i] + 6);
425*288bf522SAndroid Build Coastguard Worker         return 1;
426*288bf522SAndroid Build Coastguard Worker       }
427*288bf522SAndroid Build Coastguard Worker       cpu_set_t cpuset;
428*288bf522SAndroid Build Coastguard Worker       CPU_ZERO(&cpuset);
429*288bf522SAndroid Build Coastguard Worker       CPU_SET(cpu, &cpuset);
430*288bf522SAndroid Build Coastguard Worker       if (sched_setaffinity(0, sizeof(cpuset), &cpuset) != 0) {
431*288bf522SAndroid Build Coastguard Worker         if (errno == EINVAL) {
432*288bf522SAndroid Build Coastguard Worker           printf("Invalid cpu %d\n", cpu);
433*288bf522SAndroid Build Coastguard Worker           return 1;
434*288bf522SAndroid Build Coastguard Worker         }
435*288bf522SAndroid Build Coastguard Worker         perror("sched_setaffinity failed");
436*288bf522SAndroid Build Coastguard Worker         return 1;
437*288bf522SAndroid Build Coastguard Worker       }
438*288bf522SAndroid Build Coastguard Worker       printf("Locking to cpu %d\n", cpu);
439*288bf522SAndroid Build Coastguard Worker     } else {
440*288bf522SAndroid Build Coastguard Worker       args.push_back(argv[i]);
441*288bf522SAndroid Build Coastguard Worker     }
442*288bf522SAndroid Build Coastguard Worker   }
443*288bf522SAndroid Build Coastguard Worker 
444*288bf522SAndroid Build Coastguard Worker   argc = args.size();
445*288bf522SAndroid Build Coastguard Worker   ::benchmark::Initialize(&argc, args.data());
446*288bf522SAndroid Build Coastguard Worker   if (::benchmark::ReportUnrecognizedArguments(argc, args.data())) return 1;
447*288bf522SAndroid Build Coastguard Worker   ::benchmark::RunSpecifiedBenchmarks();
448*288bf522SAndroid Build Coastguard Worker }
449