xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/bm_arena.cc (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2017 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker // Benchmark arenas
20*cc02d7e2SAndroid Build Coastguard Worker 
21*cc02d7e2SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
22*cc02d7e2SAndroid Build Coastguard Worker 
23*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/resource_quota/arena.h"
24*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/resource_quota/resource_quota.h"
25*cc02d7e2SAndroid Build Coastguard Worker #include "test/core/util/test_config.h"
26*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/microbenchmarks/helpers.h"
27*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/test_config.h"
28*cc02d7e2SAndroid Build Coastguard Worker 
29*cc02d7e2SAndroid Build Coastguard Worker using grpc_core::Arena;
30*cc02d7e2SAndroid Build Coastguard Worker 
BM_Arena_NoOp(benchmark::State & state)31*cc02d7e2SAndroid Build Coastguard Worker static void BM_Arena_NoOp(benchmark::State& state) {
32*cc02d7e2SAndroid Build Coastguard Worker   grpc_core::MemoryAllocator memory_allocator =
33*cc02d7e2SAndroid Build Coastguard Worker       grpc_core::MemoryAllocator(grpc_core::ResourceQuota::Default()
34*cc02d7e2SAndroid Build Coastguard Worker                                      ->memory_quota()
35*cc02d7e2SAndroid Build Coastguard Worker                                      ->CreateMemoryAllocator("test"));
36*cc02d7e2SAndroid Build Coastguard Worker   for (auto _ : state) {
37*cc02d7e2SAndroid Build Coastguard Worker     Arena::Create(state.range(0), &memory_allocator)->Destroy();
38*cc02d7e2SAndroid Build Coastguard Worker   }
39*cc02d7e2SAndroid Build Coastguard Worker }
40*cc02d7e2SAndroid Build Coastguard Worker BENCHMARK(BM_Arena_NoOp)->Range(1, 1024 * 1024);
41*cc02d7e2SAndroid Build Coastguard Worker 
BM_Arena_ManyAlloc(benchmark::State & state)42*cc02d7e2SAndroid Build Coastguard Worker static void BM_Arena_ManyAlloc(benchmark::State& state) {
43*cc02d7e2SAndroid Build Coastguard Worker   grpc_core::MemoryAllocator memory_allocator =
44*cc02d7e2SAndroid Build Coastguard Worker       grpc_core::MemoryAllocator(grpc_core::ResourceQuota::Default()
45*cc02d7e2SAndroid Build Coastguard Worker                                      ->memory_quota()
46*cc02d7e2SAndroid Build Coastguard Worker                                      ->CreateMemoryAllocator("test"));
47*cc02d7e2SAndroid Build Coastguard Worker   Arena* a = Arena::Create(state.range(0), &memory_allocator);
48*cc02d7e2SAndroid Build Coastguard Worker   const size_t realloc_after =
49*cc02d7e2SAndroid Build Coastguard Worker       1024 * 1024 * 1024 / ((state.range(1) + 15) & 0xffffff0u);
50*cc02d7e2SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
51*cc02d7e2SAndroid Build Coastguard Worker     a->Alloc(state.range(1));
52*cc02d7e2SAndroid Build Coastguard Worker     // periodically recreate arena to avoid OOM
53*cc02d7e2SAndroid Build Coastguard Worker     if (state.iterations() % realloc_after == 0) {
54*cc02d7e2SAndroid Build Coastguard Worker       a->Destroy();
55*cc02d7e2SAndroid Build Coastguard Worker       a = Arena::Create(state.range(0), &memory_allocator);
56*cc02d7e2SAndroid Build Coastguard Worker     }
57*cc02d7e2SAndroid Build Coastguard Worker   }
58*cc02d7e2SAndroid Build Coastguard Worker   a->Destroy();
59*cc02d7e2SAndroid Build Coastguard Worker }
60*cc02d7e2SAndroid Build Coastguard Worker BENCHMARK(BM_Arena_ManyAlloc)->Ranges({{1, 1024 * 1024}, {1, 32 * 1024}});
61*cc02d7e2SAndroid Build Coastguard Worker 
BM_Arena_Batch(benchmark::State & state)62*cc02d7e2SAndroid Build Coastguard Worker static void BM_Arena_Batch(benchmark::State& state) {
63*cc02d7e2SAndroid Build Coastguard Worker   grpc_core::MemoryAllocator memory_allocator =
64*cc02d7e2SAndroid Build Coastguard Worker       grpc_core::MemoryAllocator(grpc_core::ResourceQuota::Default()
65*cc02d7e2SAndroid Build Coastguard Worker                                      ->memory_quota()
66*cc02d7e2SAndroid Build Coastguard Worker                                      ->CreateMemoryAllocator("test"));
67*cc02d7e2SAndroid Build Coastguard Worker   for (auto _ : state) {
68*cc02d7e2SAndroid Build Coastguard Worker     Arena* a = Arena::Create(state.range(0), &memory_allocator);
69*cc02d7e2SAndroid Build Coastguard Worker     for (int i = 0; i < state.range(1); i++) {
70*cc02d7e2SAndroid Build Coastguard Worker       a->Alloc(state.range(2));
71*cc02d7e2SAndroid Build Coastguard Worker     }
72*cc02d7e2SAndroid Build Coastguard Worker     a->Destroy();
73*cc02d7e2SAndroid Build Coastguard Worker   }
74*cc02d7e2SAndroid Build Coastguard Worker }
75*cc02d7e2SAndroid Build Coastguard Worker BENCHMARK(BM_Arena_Batch)->Ranges({{1, 64 * 1024}, {1, 64}, {1, 1024}});
76*cc02d7e2SAndroid Build Coastguard Worker 
77*cc02d7e2SAndroid Build Coastguard Worker struct TestThingToAllocate {
78*cc02d7e2SAndroid Build Coastguard Worker   int a;
79*cc02d7e2SAndroid Build Coastguard Worker   int b;
80*cc02d7e2SAndroid Build Coastguard Worker   int c;
81*cc02d7e2SAndroid Build Coastguard Worker   int d;
82*cc02d7e2SAndroid Build Coastguard Worker };
83*cc02d7e2SAndroid Build Coastguard Worker 
BM_Arena_MakePooled_Small(benchmark::State & state)84*cc02d7e2SAndroid Build Coastguard Worker static void BM_Arena_MakePooled_Small(benchmark::State& state) {
85*cc02d7e2SAndroid Build Coastguard Worker   grpc_core::MemoryAllocator memory_allocator =
86*cc02d7e2SAndroid Build Coastguard Worker       grpc_core::MemoryAllocator(grpc_core::ResourceQuota::Default()
87*cc02d7e2SAndroid Build Coastguard Worker                                      ->memory_quota()
88*cc02d7e2SAndroid Build Coastguard Worker                                      ->CreateMemoryAllocator("test"));
89*cc02d7e2SAndroid Build Coastguard Worker   Arena* a = Arena::Create(1024, &memory_allocator);
90*cc02d7e2SAndroid Build Coastguard Worker   for (auto _ : state) {
91*cc02d7e2SAndroid Build Coastguard Worker     a->MakePooled<TestThingToAllocate>();
92*cc02d7e2SAndroid Build Coastguard Worker   }
93*cc02d7e2SAndroid Build Coastguard Worker   a->Destroy();
94*cc02d7e2SAndroid Build Coastguard Worker }
95*cc02d7e2SAndroid Build Coastguard Worker BENCHMARK(BM_Arena_MakePooled_Small);
96*cc02d7e2SAndroid Build Coastguard Worker 
BM_Arena_MakePooled3_Small(benchmark::State & state)97*cc02d7e2SAndroid Build Coastguard Worker static void BM_Arena_MakePooled3_Small(benchmark::State& state) {
98*cc02d7e2SAndroid Build Coastguard Worker   grpc_core::MemoryAllocator memory_allocator =
99*cc02d7e2SAndroid Build Coastguard Worker       grpc_core::MemoryAllocator(grpc_core::ResourceQuota::Default()
100*cc02d7e2SAndroid Build Coastguard Worker                                      ->memory_quota()
101*cc02d7e2SAndroid Build Coastguard Worker                                      ->CreateMemoryAllocator("test"));
102*cc02d7e2SAndroid Build Coastguard Worker   Arena* a = Arena::Create(1024, &memory_allocator);
103*cc02d7e2SAndroid Build Coastguard Worker   for (auto _ : state) {
104*cc02d7e2SAndroid Build Coastguard Worker     auto x = a->MakePooled<TestThingToAllocate>();
105*cc02d7e2SAndroid Build Coastguard Worker     auto y = a->MakePooled<TestThingToAllocate>();
106*cc02d7e2SAndroid Build Coastguard Worker     auto z = a->MakePooled<TestThingToAllocate>();
107*cc02d7e2SAndroid Build Coastguard Worker   }
108*cc02d7e2SAndroid Build Coastguard Worker   a->Destroy();
109*cc02d7e2SAndroid Build Coastguard Worker }
110*cc02d7e2SAndroid Build Coastguard Worker BENCHMARK(BM_Arena_MakePooled3_Small);
111*cc02d7e2SAndroid Build Coastguard Worker 
BM_Arena_NewDeleteComparison_Small(benchmark::State & state)112*cc02d7e2SAndroid Build Coastguard Worker static void BM_Arena_NewDeleteComparison_Small(benchmark::State& state) {
113*cc02d7e2SAndroid Build Coastguard Worker   for (auto _ : state) {
114*cc02d7e2SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(std::make_unique<TestThingToAllocate>());
115*cc02d7e2SAndroid Build Coastguard Worker   }
116*cc02d7e2SAndroid Build Coastguard Worker }
117*cc02d7e2SAndroid Build Coastguard Worker BENCHMARK(BM_Arena_NewDeleteComparison_Small);
118*cc02d7e2SAndroid Build Coastguard Worker 
119*cc02d7e2SAndroid Build Coastguard Worker // Some distros have RunSpecifiedBenchmarks under the benchmark namespace,
120*cc02d7e2SAndroid Build Coastguard Worker // and others do not. This allows us to support both modes.
121*cc02d7e2SAndroid Build Coastguard Worker namespace benchmark {
RunTheBenchmarksNamespaced()122*cc02d7e2SAndroid Build Coastguard Worker void RunTheBenchmarksNamespaced() { RunSpecifiedBenchmarks(); }
123*cc02d7e2SAndroid Build Coastguard Worker }  // namespace benchmark
124*cc02d7e2SAndroid Build Coastguard Worker 
main(int argc,char ** argv)125*cc02d7e2SAndroid Build Coastguard Worker int main(int argc, char** argv) {
126*cc02d7e2SAndroid Build Coastguard Worker   grpc::testing::TestEnvironment env(&argc, argv);
127*cc02d7e2SAndroid Build Coastguard Worker   ::benchmark::Initialize(&argc, argv);
128*cc02d7e2SAndroid Build Coastguard Worker   grpc::testing::InitTest(&argc, &argv, false);
129*cc02d7e2SAndroid Build Coastguard Worker   benchmark::RunTheBenchmarksNamespaced();
130*cc02d7e2SAndroid Build Coastguard Worker   return 0;
131*cc02d7e2SAndroid Build Coastguard Worker }
132