xref: /netbsd-src/external/apache2/llvm/dist/libcxx/benchmarks/ContainerBenchmarks.h (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg // -*- C++ -*-
2*4d6fc14bSjoerg //===----------------------------------------------------------------------===//
3*4d6fc14bSjoerg //
4*4d6fc14bSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4d6fc14bSjoerg // See https://llvm.org/LICENSE.txt for license information.
6*4d6fc14bSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4d6fc14bSjoerg //
8*4d6fc14bSjoerg //===----------------------------------------------------------------------===//
9*4d6fc14bSjoerg 
10*4d6fc14bSjoerg #ifndef BENCHMARK_CONTAINER_BENCHMARKS_H
11*4d6fc14bSjoerg #define BENCHMARK_CONTAINER_BENCHMARKS_H
12*4d6fc14bSjoerg 
13*4d6fc14bSjoerg #include <cassert>
14*4d6fc14bSjoerg 
15*4d6fc14bSjoerg #include "Utilities.h"
16*4d6fc14bSjoerg #include "benchmark/benchmark.h"
17*4d6fc14bSjoerg 
18*4d6fc14bSjoerg namespace ContainerBenchmarks {
19*4d6fc14bSjoerg 
20*4d6fc14bSjoerg template <class Container>
BM_ConstructSize(benchmark::State & st,Container)21*4d6fc14bSjoerg void BM_ConstructSize(benchmark::State& st, Container) {
22*4d6fc14bSjoerg   auto size = st.range(0);
23*4d6fc14bSjoerg   for (auto _ : st) {
24*4d6fc14bSjoerg     Container c(size);
25*4d6fc14bSjoerg     DoNotOptimizeData(c);
26*4d6fc14bSjoerg   }
27*4d6fc14bSjoerg }
28*4d6fc14bSjoerg 
29*4d6fc14bSjoerg template <class Container>
BM_ConstructSizeValue(benchmark::State & st,Container,typename Container::value_type const & val)30*4d6fc14bSjoerg void BM_ConstructSizeValue(benchmark::State& st, Container, typename Container::value_type const& val) {
31*4d6fc14bSjoerg   const auto size = st.range(0);
32*4d6fc14bSjoerg   for (auto _ : st) {
33*4d6fc14bSjoerg     Container c(size, val);
34*4d6fc14bSjoerg     DoNotOptimizeData(c);
35*4d6fc14bSjoerg   }
36*4d6fc14bSjoerg }
37*4d6fc14bSjoerg 
38*4d6fc14bSjoerg template <class Container, class GenInputs>
BM_ConstructIterIter(benchmark::State & st,Container,GenInputs gen)39*4d6fc14bSjoerg void BM_ConstructIterIter(benchmark::State& st, Container, GenInputs gen) {
40*4d6fc14bSjoerg     auto in = gen(st.range(0));
41*4d6fc14bSjoerg     const auto begin = in.begin();
42*4d6fc14bSjoerg     const auto end = in.end();
43*4d6fc14bSjoerg     benchmark::DoNotOptimize(&in);
44*4d6fc14bSjoerg     while (st.KeepRunning()) {
45*4d6fc14bSjoerg         Container c(begin, end);
46*4d6fc14bSjoerg         DoNotOptimizeData(c);
47*4d6fc14bSjoerg     }
48*4d6fc14bSjoerg }
49*4d6fc14bSjoerg 
50*4d6fc14bSjoerg template <class Container, class GenInputs>
BM_InsertValue(benchmark::State & st,Container c,GenInputs gen)51*4d6fc14bSjoerg void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) {
52*4d6fc14bSjoerg     auto in = gen(st.range(0));
53*4d6fc14bSjoerg     const auto end = in.end();
54*4d6fc14bSjoerg     while (st.KeepRunning()) {
55*4d6fc14bSjoerg         c.clear();
56*4d6fc14bSjoerg         for (auto it = in.begin(); it != end; ++it) {
57*4d6fc14bSjoerg             benchmark::DoNotOptimize(&(*c.insert(*it).first));
58*4d6fc14bSjoerg         }
59*4d6fc14bSjoerg         benchmark::ClobberMemory();
60*4d6fc14bSjoerg     }
61*4d6fc14bSjoerg }
62*4d6fc14bSjoerg 
63*4d6fc14bSjoerg template <class Container, class GenInputs>
BM_InsertValueRehash(benchmark::State & st,Container c,GenInputs gen)64*4d6fc14bSjoerg void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
65*4d6fc14bSjoerg     auto in = gen(st.range(0));
66*4d6fc14bSjoerg     const auto end = in.end();
67*4d6fc14bSjoerg     while (st.KeepRunning()) {
68*4d6fc14bSjoerg         c.clear();
69*4d6fc14bSjoerg         c.rehash(16);
70*4d6fc14bSjoerg         for (auto it = in.begin(); it != end; ++it) {
71*4d6fc14bSjoerg             benchmark::DoNotOptimize(&(*c.insert(*it).first));
72*4d6fc14bSjoerg         }
73*4d6fc14bSjoerg         benchmark::ClobberMemory();
74*4d6fc14bSjoerg     }
75*4d6fc14bSjoerg }
76*4d6fc14bSjoerg 
77*4d6fc14bSjoerg 
78*4d6fc14bSjoerg template <class Container, class GenInputs>
BM_InsertDuplicate(benchmark::State & st,Container c,GenInputs gen)79*4d6fc14bSjoerg void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
80*4d6fc14bSjoerg     auto in = gen(st.range(0));
81*4d6fc14bSjoerg     const auto end = in.end();
82*4d6fc14bSjoerg     c.insert(in.begin(), in.end());
83*4d6fc14bSjoerg     benchmark::DoNotOptimize(&c);
84*4d6fc14bSjoerg     benchmark::DoNotOptimize(&in);
85*4d6fc14bSjoerg     while (st.KeepRunning()) {
86*4d6fc14bSjoerg         for (auto it = in.begin(); it != end; ++it) {
87*4d6fc14bSjoerg             benchmark::DoNotOptimize(&(*c.insert(*it).first));
88*4d6fc14bSjoerg         }
89*4d6fc14bSjoerg         benchmark::ClobberMemory();
90*4d6fc14bSjoerg     }
91*4d6fc14bSjoerg }
92*4d6fc14bSjoerg 
93*4d6fc14bSjoerg 
94*4d6fc14bSjoerg template <class Container, class GenInputs>
BM_EmplaceDuplicate(benchmark::State & st,Container c,GenInputs gen)95*4d6fc14bSjoerg void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) {
96*4d6fc14bSjoerg     auto in = gen(st.range(0));
97*4d6fc14bSjoerg     const auto end = in.end();
98*4d6fc14bSjoerg     c.insert(in.begin(), in.end());
99*4d6fc14bSjoerg     benchmark::DoNotOptimize(&c);
100*4d6fc14bSjoerg     benchmark::DoNotOptimize(&in);
101*4d6fc14bSjoerg     while (st.KeepRunning()) {
102*4d6fc14bSjoerg         for (auto it = in.begin(); it != end; ++it) {
103*4d6fc14bSjoerg             benchmark::DoNotOptimize(&(*c.emplace(*it).first));
104*4d6fc14bSjoerg         }
105*4d6fc14bSjoerg         benchmark::ClobberMemory();
106*4d6fc14bSjoerg     }
107*4d6fc14bSjoerg }
108*4d6fc14bSjoerg 
109*4d6fc14bSjoerg template <class Container, class GenInputs>
BM_Find(benchmark::State & st,Container c,GenInputs gen)110*4d6fc14bSjoerg static void BM_Find(benchmark::State& st, Container c, GenInputs gen) {
111*4d6fc14bSjoerg     auto in = gen(st.range(0));
112*4d6fc14bSjoerg     c.insert(in.begin(), in.end());
113*4d6fc14bSjoerg     benchmark::DoNotOptimize(&(*c.begin()));
114*4d6fc14bSjoerg     const auto end = in.data() + in.size();
115*4d6fc14bSjoerg     while (st.KeepRunning()) {
116*4d6fc14bSjoerg         for (auto it = in.data(); it != end; ++it) {
117*4d6fc14bSjoerg             benchmark::DoNotOptimize(&(*c.find(*it)));
118*4d6fc14bSjoerg         }
119*4d6fc14bSjoerg         benchmark::ClobberMemory();
120*4d6fc14bSjoerg     }
121*4d6fc14bSjoerg }
122*4d6fc14bSjoerg 
123*4d6fc14bSjoerg template <class Container, class GenInputs>
BM_FindRehash(benchmark::State & st,Container c,GenInputs gen)124*4d6fc14bSjoerg static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) {
125*4d6fc14bSjoerg     c.rehash(8);
126*4d6fc14bSjoerg     auto in = gen(st.range(0));
127*4d6fc14bSjoerg     c.insert(in.begin(), in.end());
128*4d6fc14bSjoerg     benchmark::DoNotOptimize(&(*c.begin()));
129*4d6fc14bSjoerg     const auto end = in.data() + in.size();
130*4d6fc14bSjoerg     while (st.KeepRunning()) {
131*4d6fc14bSjoerg         for (auto it = in.data(); it != end; ++it) {
132*4d6fc14bSjoerg             benchmark::DoNotOptimize(&(*c.find(*it)));
133*4d6fc14bSjoerg         }
134*4d6fc14bSjoerg         benchmark::ClobberMemory();
135*4d6fc14bSjoerg     }
136*4d6fc14bSjoerg }
137*4d6fc14bSjoerg 
138*4d6fc14bSjoerg } // end namespace ContainerBenchmarks
139*4d6fc14bSjoerg 
140*4d6fc14bSjoerg #endif // BENCHMARK_CONTAINER_BENCHMARKS_H
141