xref: /aosp_15_r20/external/libcxx/benchmarks/ContainerBenchmarks.hpp (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker #ifndef BENCHMARK_CONTAINER_BENCHMARKS_HPP
2*58b9f456SAndroid Build Coastguard Worker #define BENCHMARK_CONTAINER_BENCHMARKS_HPP
3*58b9f456SAndroid Build Coastguard Worker 
4*58b9f456SAndroid Build Coastguard Worker #include <cassert>
5*58b9f456SAndroid Build Coastguard Worker 
6*58b9f456SAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
7*58b9f456SAndroid Build Coastguard Worker 
8*58b9f456SAndroid Build Coastguard Worker namespace ContainerBenchmarks {
9*58b9f456SAndroid Build Coastguard Worker 
10*58b9f456SAndroid Build Coastguard Worker 
11*58b9f456SAndroid Build Coastguard Worker template <class Container, class GenInputs>
BM_ConstructIterIter(benchmark::State & st,Container,GenInputs gen)12*58b9f456SAndroid Build Coastguard Worker void BM_ConstructIterIter(benchmark::State& st, Container, GenInputs gen) {
13*58b9f456SAndroid Build Coastguard Worker     auto in = gen(st.range(0));
14*58b9f456SAndroid Build Coastguard Worker     const auto begin = in.begin();
15*58b9f456SAndroid Build Coastguard Worker     const auto end = in.end();
16*58b9f456SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(&in);
17*58b9f456SAndroid Build Coastguard Worker     while (st.KeepRunning()) {
18*58b9f456SAndroid Build Coastguard Worker         Container c(begin, end);
19*58b9f456SAndroid Build Coastguard Worker         benchmark::DoNotOptimize(c.data());
20*58b9f456SAndroid Build Coastguard Worker     }
21*58b9f456SAndroid Build Coastguard Worker }
22*58b9f456SAndroid Build Coastguard Worker 
23*58b9f456SAndroid Build Coastguard Worker template <class Container, class GenInputs>
BM_InsertValue(benchmark::State & st,Container c,GenInputs gen)24*58b9f456SAndroid Build Coastguard Worker void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) {
25*58b9f456SAndroid Build Coastguard Worker     auto in = gen(st.range(0));
26*58b9f456SAndroid Build Coastguard Worker     const auto end = in.end();
27*58b9f456SAndroid Build Coastguard Worker     while (st.KeepRunning()) {
28*58b9f456SAndroid Build Coastguard Worker         c.clear();
29*58b9f456SAndroid Build Coastguard Worker         for (auto it = in.begin(); it != end; ++it) {
30*58b9f456SAndroid Build Coastguard Worker             benchmark::DoNotOptimize(&(*c.insert(*it).first));
31*58b9f456SAndroid Build Coastguard Worker         }
32*58b9f456SAndroid Build Coastguard Worker         benchmark::ClobberMemory();
33*58b9f456SAndroid Build Coastguard Worker     }
34*58b9f456SAndroid Build Coastguard Worker }
35*58b9f456SAndroid Build Coastguard Worker 
36*58b9f456SAndroid Build Coastguard Worker template <class Container, class GenInputs>
BM_InsertValueRehash(benchmark::State & st,Container c,GenInputs gen)37*58b9f456SAndroid Build Coastguard Worker void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
38*58b9f456SAndroid Build Coastguard Worker     auto in = gen(st.range(0));
39*58b9f456SAndroid Build Coastguard Worker     const auto end = in.end();
40*58b9f456SAndroid Build Coastguard Worker     while (st.KeepRunning()) {
41*58b9f456SAndroid Build Coastguard Worker         c.clear();
42*58b9f456SAndroid Build Coastguard Worker         c.rehash(16);
43*58b9f456SAndroid Build Coastguard Worker         for (auto it = in.begin(); it != end; ++it) {
44*58b9f456SAndroid Build Coastguard Worker             benchmark::DoNotOptimize(&(*c.insert(*it).first));
45*58b9f456SAndroid Build Coastguard Worker         }
46*58b9f456SAndroid Build Coastguard Worker         benchmark::ClobberMemory();
47*58b9f456SAndroid Build Coastguard Worker     }
48*58b9f456SAndroid Build Coastguard Worker }
49*58b9f456SAndroid Build Coastguard Worker 
50*58b9f456SAndroid Build Coastguard Worker 
51*58b9f456SAndroid Build Coastguard Worker template <class Container, class GenInputs>
BM_InsertDuplicate(benchmark::State & st,Container c,GenInputs gen)52*58b9f456SAndroid Build Coastguard Worker void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
53*58b9f456SAndroid Build Coastguard Worker     auto in = gen(st.range(0));
54*58b9f456SAndroid Build Coastguard Worker     const auto end = in.end();
55*58b9f456SAndroid Build Coastguard Worker     c.insert(in.begin(), in.end());
56*58b9f456SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(&c);
57*58b9f456SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(&in);
58*58b9f456SAndroid Build Coastguard Worker     while (st.KeepRunning()) {
59*58b9f456SAndroid Build Coastguard Worker         for (auto it = in.begin(); it != end; ++it) {
60*58b9f456SAndroid Build Coastguard Worker             benchmark::DoNotOptimize(&(*c.insert(*it).first));
61*58b9f456SAndroid Build Coastguard Worker         }
62*58b9f456SAndroid Build Coastguard Worker         benchmark::ClobberMemory();
63*58b9f456SAndroid Build Coastguard Worker     }
64*58b9f456SAndroid Build Coastguard Worker }
65*58b9f456SAndroid Build Coastguard Worker 
66*58b9f456SAndroid Build Coastguard Worker 
67*58b9f456SAndroid Build Coastguard Worker template <class Container, class GenInputs>
BM_EmplaceDuplicate(benchmark::State & st,Container c,GenInputs gen)68*58b9f456SAndroid Build Coastguard Worker void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) {
69*58b9f456SAndroid Build Coastguard Worker     auto in = gen(st.range(0));
70*58b9f456SAndroid Build Coastguard Worker     const auto end = in.end();
71*58b9f456SAndroid Build Coastguard Worker     c.insert(in.begin(), in.end());
72*58b9f456SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(&c);
73*58b9f456SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(&in);
74*58b9f456SAndroid Build Coastguard Worker     while (st.KeepRunning()) {
75*58b9f456SAndroid Build Coastguard Worker         for (auto it = in.begin(); it != end; ++it) {
76*58b9f456SAndroid Build Coastguard Worker             benchmark::DoNotOptimize(&(*c.emplace(*it).first));
77*58b9f456SAndroid Build Coastguard Worker         }
78*58b9f456SAndroid Build Coastguard Worker         benchmark::ClobberMemory();
79*58b9f456SAndroid Build Coastguard Worker     }
80*58b9f456SAndroid Build Coastguard Worker }
81*58b9f456SAndroid Build Coastguard Worker 
82*58b9f456SAndroid Build Coastguard Worker template <class Container, class GenInputs>
BM_Find(benchmark::State & st,Container c,GenInputs gen)83*58b9f456SAndroid Build Coastguard Worker static void BM_Find(benchmark::State& st, Container c, GenInputs gen) {
84*58b9f456SAndroid Build Coastguard Worker     auto in = gen(st.range(0));
85*58b9f456SAndroid Build Coastguard Worker     c.insert(in.begin(), in.end());
86*58b9f456SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(&(*c.begin()));
87*58b9f456SAndroid Build Coastguard Worker     const auto end = in.data() + in.size();
88*58b9f456SAndroid Build Coastguard Worker     while (st.KeepRunning()) {
89*58b9f456SAndroid Build Coastguard Worker         for (auto it = in.data(); it != end; ++it) {
90*58b9f456SAndroid Build Coastguard Worker             benchmark::DoNotOptimize(&(*c.find(*it)));
91*58b9f456SAndroid Build Coastguard Worker         }
92*58b9f456SAndroid Build Coastguard Worker         benchmark::ClobberMemory();
93*58b9f456SAndroid Build Coastguard Worker     }
94*58b9f456SAndroid Build Coastguard Worker }
95*58b9f456SAndroid Build Coastguard Worker 
96*58b9f456SAndroid Build Coastguard Worker template <class Container, class GenInputs>
BM_FindRehash(benchmark::State & st,Container c,GenInputs gen)97*58b9f456SAndroid Build Coastguard Worker static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) {
98*58b9f456SAndroid Build Coastguard Worker     c.rehash(8);
99*58b9f456SAndroid Build Coastguard Worker     auto in = gen(st.range(0));
100*58b9f456SAndroid Build Coastguard Worker     c.insert(in.begin(), in.end());
101*58b9f456SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(&(*c.begin()));
102*58b9f456SAndroid Build Coastguard Worker     const auto end = in.data() + in.size();
103*58b9f456SAndroid Build Coastguard Worker     while (st.KeepRunning()) {
104*58b9f456SAndroid Build Coastguard Worker         for (auto it = in.data(); it != end; ++it) {
105*58b9f456SAndroid Build Coastguard Worker             benchmark::DoNotOptimize(&(*c.find(*it)));
106*58b9f456SAndroid Build Coastguard Worker         }
107*58b9f456SAndroid Build Coastguard Worker         benchmark::ClobberMemory();
108*58b9f456SAndroid Build Coastguard Worker     }
109*58b9f456SAndroid Build Coastguard Worker }
110*58b9f456SAndroid Build Coastguard Worker 
111*58b9f456SAndroid Build Coastguard Worker } // end namespace ContainerBenchmarks
112*58b9f456SAndroid Build Coastguard Worker 
113*58b9f456SAndroid Build Coastguard Worker #endif // BENCHMARK_CONTAINER_BENCHMARKS_HPP
114