blob: 648617a9cd23c9cf8467412be9a6d0d97dec5e8e [file] [log] [blame]
Eric Fiselier9e3e1372016-07-19 23:07:03 +00001#ifndef BENCHMARK_CONTAINER_BENCHMARKS_HPP
2#define BENCHMARK_CONTAINER_BENCHMARKS_HPP
3
4#include <cassert>
5
Eric Fiselier87038cd2018-01-18 04:23:01 +00006#include "benchmark/benchmark.h"
Eric Fiselier9e3e1372016-07-19 23:07:03 +00007
8namespace ContainerBenchmarks {
9
Eric Fiseliere7afbd32019-07-28 04:37:02 +000010template <class Container>
11void BM_ConstructSize(benchmark::State& st, Container) {
12 auto size = st.range(0);
13 for (auto _ : st) {
14 Container c(size);
15 benchmark::DoNotOptimize(c.data());
16 }
17}
18
19template <class Container>
20void BM_ConstructSizeValue(benchmark::State& st, Container, typename Container::value_type const& val) {
21 const auto size = st.range(0);
22 for (auto _ : st) {
23 Container c(size, val);
24 benchmark::DoNotOptimize(c.data());
25 }
26}
Eric Fiseliera9a1d392016-07-24 06:51:55 +000027
28template <class Container, class GenInputs>
29void BM_ConstructIterIter(benchmark::State& st, Container, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000030 auto in = gen(st.range(0));
Sebastian Pop07bb2852016-10-14 00:07:57 +000031 const auto begin = in.begin();
Eric Fiseliera9a1d392016-07-24 06:51:55 +000032 const auto end = in.end();
33 benchmark::DoNotOptimize(&in);
34 while (st.KeepRunning()) {
Sebastian Pop07bb2852016-10-14 00:07:57 +000035 Container c(begin, end);
Eric Fiseliera9a1d392016-07-24 06:51:55 +000036 benchmark::DoNotOptimize(c.data());
37 }
38}
39
Eric Fiselier9e3e1372016-07-19 23:07:03 +000040template <class Container, class GenInputs>
41void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000042 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +000043 const auto end = in.end();
44 while (st.KeepRunning()) {
45 c.clear();
46 for (auto it = in.begin(); it != end; ++it) {
47 benchmark::DoNotOptimize(&(*c.insert(*it).first));
48 }
49 benchmark::ClobberMemory();
50 }
51}
52
53template <class Container, class GenInputs>
54void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000055 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +000056 const auto end = in.end();
57 while (st.KeepRunning()) {
58 c.clear();
59 c.rehash(16);
60 for (auto it = in.begin(); it != end; ++it) {
61 benchmark::DoNotOptimize(&(*c.insert(*it).first));
62 }
63 benchmark::ClobberMemory();
64 }
65}
66
Eric Fiselierb658af22016-07-24 06:22:25 +000067
68template <class Container, class GenInputs>
69void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000070 auto in = gen(st.range(0));
Eric Fiselierb658af22016-07-24 06:22:25 +000071 const auto end = in.end();
72 c.insert(in.begin(), in.end());
73 benchmark::DoNotOptimize(&c);
74 benchmark::DoNotOptimize(&in);
75 while (st.KeepRunning()) {
76 for (auto it = in.begin(); it != end; ++it) {
77 benchmark::DoNotOptimize(&(*c.insert(*it).first));
78 }
79 benchmark::ClobberMemory();
80 }
81}
82
83
84template <class Container, class GenInputs>
85void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000086 auto in = gen(st.range(0));
Eric Fiselierb658af22016-07-24 06:22:25 +000087 const auto end = in.end();
88 c.insert(in.begin(), in.end());
89 benchmark::DoNotOptimize(&c);
90 benchmark::DoNotOptimize(&in);
91 while (st.KeepRunning()) {
92 for (auto it = in.begin(); it != end; ++it) {
93 benchmark::DoNotOptimize(&(*c.emplace(*it).first));
94 }
95 benchmark::ClobberMemory();
96 }
97}
98
Eric Fiselier9e3e1372016-07-19 23:07:03 +000099template <class Container, class GenInputs>
100static void BM_Find(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +0000101 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +0000102 c.insert(in.begin(), in.end());
103 benchmark::DoNotOptimize(&(*c.begin()));
104 const auto end = in.data() + in.size();
105 while (st.KeepRunning()) {
106 for (auto it = in.data(); it != end; ++it) {
107 benchmark::DoNotOptimize(&(*c.find(*it)));
108 }
109 benchmark::ClobberMemory();
110 }
111}
112
113template <class Container, class GenInputs>
114static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) {
115 c.rehash(8);
Eric Fiseliere5e33e42016-08-09 18:56:48 +0000116 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +0000117 c.insert(in.begin(), in.end());
118 benchmark::DoNotOptimize(&(*c.begin()));
119 const auto end = in.data() + in.size();
120 while (st.KeepRunning()) {
121 for (auto it = in.data(); it != end; ++it) {
122 benchmark::DoNotOptimize(&(*c.find(*it)));
123 }
124 benchmark::ClobberMemory();
125 }
Eric Fiselier9e3e1372016-07-19 23:07:03 +0000126}
127
128} // end namespace ContainerBenchmarks
129
130#endif // BENCHMARK_CONTAINER_BENCHMARKS_HPP