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