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