blob: dc268e7ebca3c6a207129a6713c00b090bda67f3 [file] [log] [blame]
Eric Fiselierd9b9ef72016-07-19 23:07:03 +00001#ifndef BENCHMARK_CONTAINER_BENCHMARKS_HPP
2#define BENCHMARK_CONTAINER_BENCHMARKS_HPP
3
4#include <cassert>
5
6#include "benchmark/benchmark_api.h"
7
8namespace ContainerBenchmarks {
9
Eric Fiselierb90f9db2016-07-24 06:51:55 +000010
11template <class Container, class GenInputs>
12void BM_ConstructIterIter(benchmark::State& st, Container, GenInputs gen) {
Eric Fiselier30b48cb2016-08-09 18:56:48 +000013 auto in = gen(st.range(0));
Sebastian Pop3d12b5c2016-10-14 00:07:57 +000014 const auto begin = in.begin();
Eric Fiselierb90f9db2016-07-24 06:51:55 +000015 const auto end = in.end();
16 benchmark::DoNotOptimize(&in);
17 while (st.KeepRunning()) {
Sebastian Pop3d12b5c2016-10-14 00:07:57 +000018 Container c(begin, end);
Eric Fiselierb90f9db2016-07-24 06:51:55 +000019 benchmark::DoNotOptimize(c.data());
20 }
21}
22
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000023template <class Container, class GenInputs>
24void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiselier30b48cb2016-08-09 18:56:48 +000025 auto in = gen(st.range(0));
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000026 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
36template <class Container, class GenInputs>
37void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiselier30b48cb2016-08-09 18:56:48 +000038 auto in = gen(st.range(0));
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000039 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
Eric Fiselierd7570902016-07-24 06:22:25 +000050
51template <class Container, class GenInputs>
52void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiselier30b48cb2016-08-09 18:56:48 +000053 auto in = gen(st.range(0));
Eric Fiselierd7570902016-07-24 06:22:25 +000054 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
67template <class Container, class GenInputs>
68void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiselier30b48cb2016-08-09 18:56:48 +000069 auto in = gen(st.range(0));
Eric Fiselierd7570902016-07-24 06:22:25 +000070 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
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000082template <class Container, class GenInputs>
83static void BM_Find(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiselier30b48cb2016-08-09 18:56:48 +000084 auto in = gen(st.range(0));
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000085 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
96template <class Container, class GenInputs>
97static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) {
98 c.rehash(8);
Eric Fiselier30b48cb2016-08-09 18:56:48 +000099 auto in = gen(st.range(0));
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000100 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 }
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000109}
110
111} // end namespace ContainerBenchmarks
112
113#endif // BENCHMARK_CONTAINER_BENCHMARKS_HPP