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