xref: /aosp_15_r20/system/unwinding/libunwindstack/benchmarks/Utils.cpp (revision eb293b8f56ee8303637c5595cfcdeef8039e85c6)
1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker  * Copyright (C) 2020 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 <err.h>
18*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h>
19*eb293b8fSAndroid Build Coastguard Worker 
20*eb293b8fSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
21*eb293b8fSAndroid Build Coastguard Worker #include <malloc.h>
22*eb293b8fSAndroid Build Coastguard Worker 
23*eb293b8fSAndroid Build Coastguard Worker #include <string>
24*eb293b8fSAndroid Build Coastguard Worker #include <vector>
25*eb293b8fSAndroid Build Coastguard Worker 
26*eb293b8fSAndroid Build Coastguard Worker #include <android-base/file.h>
27*eb293b8fSAndroid Build Coastguard Worker #include <android-base/strings.h>
28*eb293b8fSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
29*eb293b8fSAndroid Build Coastguard Worker 
30*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Elf.h>
31*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Memory.h>
32*eb293b8fSAndroid Build Coastguard Worker 
33*eb293b8fSAndroid Build Coastguard Worker #include "utils/OfflineUnwindUtils.h"
34*eb293b8fSAndroid Build Coastguard Worker 
35*eb293b8fSAndroid Build Coastguard Worker #include "Utils.h"
36*eb293b8fSAndroid Build Coastguard Worker 
GetBenchmarkFilesDirectory()37*eb293b8fSAndroid Build Coastguard Worker std::string GetBenchmarkFilesDirectory() {
38*eb293b8fSAndroid Build Coastguard Worker   std::string path = android::base::GetExecutableDirectory() + "/benchmarks/files/";
39*eb293b8fSAndroid Build Coastguard Worker   unwindstack::DecompressFiles(path);
40*eb293b8fSAndroid Build Coastguard Worker   return path;
41*eb293b8fSAndroid Build Coastguard Worker }
42*eb293b8fSAndroid Build Coastguard Worker 
GetElfFile()43*eb293b8fSAndroid Build Coastguard Worker std::string GetElfFile() {
44*eb293b8fSAndroid Build Coastguard Worker   return GetBenchmarkFilesDirectory() + "libart_arm.so";
45*eb293b8fSAndroid Build Coastguard Worker }
46*eb293b8fSAndroid Build Coastguard Worker 
GetSymbolSortedElfFile()47*eb293b8fSAndroid Build Coastguard Worker std::string GetSymbolSortedElfFile() {
48*eb293b8fSAndroid Build Coastguard Worker   return GetBenchmarkFilesDirectory() + "boot_arm.oat";
49*eb293b8fSAndroid Build Coastguard Worker }
50*eb293b8fSAndroid Build Coastguard Worker 
GetLargeCompressedFrameElfFile()51*eb293b8fSAndroid Build Coastguard Worker std::string GetLargeCompressedFrameElfFile() {
52*eb293b8fSAndroid Build Coastguard Worker   return GetBenchmarkFilesDirectory() + "libpac.so";
53*eb293b8fSAndroid Build Coastguard Worker }
54*eb293b8fSAndroid Build Coastguard Worker 
GetLargeEhFrameElfFile()55*eb293b8fSAndroid Build Coastguard Worker std::string GetLargeEhFrameElfFile() {
56*eb293b8fSAndroid Build Coastguard Worker   return GetBenchmarkFilesDirectory() + "libLLVM_android.so";
57*eb293b8fSAndroid Build Coastguard Worker }
58*eb293b8fSAndroid Build Coastguard Worker 
59*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__)
60*eb293b8fSAndroid Build Coastguard Worker 
61*eb293b8fSAndroid Build Coastguard Worker #include <meminfo/procmeminfo.h>
62*eb293b8fSAndroid Build Coastguard Worker #include <procinfo/process_map.h>
63*eb293b8fSAndroid Build Coastguard Worker 
GetRSSBytes()64*eb293b8fSAndroid Build Coastguard Worker uint64_t GetRSSBytes() {
65*eb293b8fSAndroid Build Coastguard Worker   uint64_t total_bytes = 0;
66*eb293b8fSAndroid Build Coastguard Worker   android::meminfo::ProcMemInfo proc_mem(getpid());
67*eb293b8fSAndroid Build Coastguard Worker   const std::vector<android::meminfo::Vma>& maps = proc_mem.MapsWithoutUsageStats();
68*eb293b8fSAndroid Build Coastguard Worker   for (auto& vma : maps) {
69*eb293b8fSAndroid Build Coastguard Worker     if (vma.name == "[anon:libc_malloc]" || android::base::StartsWith(vma.name, "[anon:scudo:") ||
70*eb293b8fSAndroid Build Coastguard Worker         android::base::StartsWith(vma.name, "[anon:GWP-ASan")) {
71*eb293b8fSAndroid Build Coastguard Worker       android::meminfo::Vma update_vma(vma);
72*eb293b8fSAndroid Build Coastguard Worker       if (!proc_mem.FillInVmaStats(update_vma)) {
73*eb293b8fSAndroid Build Coastguard Worker         err(1, "FillInVmaStats failed");
74*eb293b8fSAndroid Build Coastguard Worker       }
75*eb293b8fSAndroid Build Coastguard Worker       total_bytes += update_vma.usage.rss;
76*eb293b8fSAndroid Build Coastguard Worker     }
77*eb293b8fSAndroid Build Coastguard Worker   }
78*eb293b8fSAndroid Build Coastguard Worker   return total_bytes;
79*eb293b8fSAndroid Build Coastguard Worker }
80*eb293b8fSAndroid Build Coastguard Worker #endif
81*eb293b8fSAndroid Build Coastguard Worker 
SetBenchmarkCounters(benchmark::State & state)82*eb293b8fSAndroid Build Coastguard Worker void MemoryTracker::SetBenchmarkCounters(benchmark::State& state) {
83*eb293b8fSAndroid Build Coastguard Worker   double total_iterations = static_cast<double>(state.iterations());
84*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__)
85*eb293b8fSAndroid Build Coastguard Worker   state.counters["AVG_RSS_BYTES"] = total_rss_bytes_ / total_iterations;
86*eb293b8fSAndroid Build Coastguard Worker   state.counters["MAX_RSS_BYTES"] = max_rss_bytes_;
87*eb293b8fSAndroid Build Coastguard Worker   state.counters["MIN_RSS_BYTES"] = min_rss_bytes_;
88*eb293b8fSAndroid Build Coastguard Worker #endif
89*eb293b8fSAndroid Build Coastguard Worker   state.counters["AVG_ALLOCATED_BYTES"] = total_alloc_bytes_ / total_iterations;
90*eb293b8fSAndroid Build Coastguard Worker   state.counters["MAX_ALLOCATED_BYTES"] = max_alloc_bytes_;
91*eb293b8fSAndroid Build Coastguard Worker   state.counters["MIN_ALLOCATED_BYTES"] = min_alloc_bytes_;
92*eb293b8fSAndroid Build Coastguard Worker }
93*eb293b8fSAndroid Build Coastguard Worker 
StartTrackingAllocations()94*eb293b8fSAndroid Build Coastguard Worker void MemoryTracker::StartTrackingAllocations() {
95*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__)
96*eb293b8fSAndroid Build Coastguard Worker   mallopt(M_PURGE_ALL, 0);
97*eb293b8fSAndroid Build Coastguard Worker   rss_bytes_before_ = GetRSSBytes();
98*eb293b8fSAndroid Build Coastguard Worker #endif
99*eb293b8fSAndroid Build Coastguard Worker   alloc_bytes_before_ = mallinfo().uordblks;
100*eb293b8fSAndroid Build Coastguard Worker }
101*eb293b8fSAndroid Build Coastguard Worker 
StopTrackingAllocations()102*eb293b8fSAndroid Build Coastguard Worker void MemoryTracker::StopTrackingAllocations() {
103*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__)
104*eb293b8fSAndroid Build Coastguard Worker   mallopt(M_PURGE_ALL, 0);
105*eb293b8fSAndroid Build Coastguard Worker #endif
106*eb293b8fSAndroid Build Coastguard Worker   uint64_t alloc_bytes = 0;
107*eb293b8fSAndroid Build Coastguard Worker   uint64_t alloc_bytes_after = mallinfo().uordblks;
108*eb293b8fSAndroid Build Coastguard Worker   if (alloc_bytes_after > alloc_bytes_before_) {
109*eb293b8fSAndroid Build Coastguard Worker     alloc_bytes = alloc_bytes_after - alloc_bytes_before_;
110*eb293b8fSAndroid Build Coastguard Worker   }
111*eb293b8fSAndroid Build Coastguard Worker   total_alloc_bytes_ += alloc_bytes;
112*eb293b8fSAndroid Build Coastguard Worker   if (alloc_bytes > max_alloc_bytes_) max_alloc_bytes_ = alloc_bytes;
113*eb293b8fSAndroid Build Coastguard Worker   if (alloc_bytes < min_alloc_bytes_) min_alloc_bytes_ = alloc_bytes;
114*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__)
115*eb293b8fSAndroid Build Coastguard Worker   uint64_t rss_bytes = 0;
116*eb293b8fSAndroid Build Coastguard Worker   uint64_t rss_bytes_after = GetRSSBytes();
117*eb293b8fSAndroid Build Coastguard Worker   if (rss_bytes_after > rss_bytes_before_) {
118*eb293b8fSAndroid Build Coastguard Worker     rss_bytes = rss_bytes_after - rss_bytes_before_;
119*eb293b8fSAndroid Build Coastguard Worker   }
120*eb293b8fSAndroid Build Coastguard Worker   total_rss_bytes_ += rss_bytes;
121*eb293b8fSAndroid Build Coastguard Worker   if (rss_bytes > max_rss_bytes_) max_rss_bytes_ = rss_bytes;
122*eb293b8fSAndroid Build Coastguard Worker   if (rss_bytes < min_rss_bytes_) min_rss_bytes_ = rss_bytes;
123*eb293b8fSAndroid Build Coastguard Worker #endif
124*eb293b8fSAndroid Build Coastguard Worker }
125