blob: 973a135f70daff7ef44714ab3a7aeab53293307a [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
6#include "benchmark/benchmark_api.h"
7
8namespace ContainerBenchmarks {
9
Eric Fiseliera9a1d392016-07-24 06:51:55 +000010
11template <class Container, class GenInputs>
12void BM_ConstructIterIter(benchmark::State& st, Container, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000013 auto in = gen(st.range(0));
Eric Fiseliera9a1d392016-07-24 06:51:55 +000014 const auto end = in.end();
15 benchmark::DoNotOptimize(&in);
16 while (st.KeepRunning()) {
17 Container c(in.begin(), in.end());
18 benchmark::DoNotOptimize(c.data());
19 }
20}
21
Eric Fiselier9e3e1372016-07-19 23:07:03 +000022template <class Container, class GenInputs>
23void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000024 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +000025 const auto end = in.end();
26 while (st.KeepRunning()) {
27 c.clear();
28 for (auto it = in.begin(); it != end; ++it) {
29 benchmark::DoNotOptimize(&(*c.insert(*it).first));
30 }
31 benchmark::ClobberMemory();
32 }
33}
34
35template <class Container, class GenInputs>
36void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000037 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +000038 const auto end = in.end();
39 while (st.KeepRunning()) {
40 c.clear();
41 c.rehash(16);
42 for (auto it = in.begin(); it != end; ++it) {
43 benchmark::DoNotOptimize(&(*c.insert(*it).first));
44 }
45 benchmark::ClobberMemory();
46 }
47}
48
Eric Fiselierb658af22016-07-24 06:22:25 +000049
50template <class Container, class GenInputs>
51void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000052 auto in = gen(st.range(0));
Eric Fiselierb658af22016-07-24 06:22:25 +000053 const auto end = in.end();
54 c.insert(in.begin(), in.end());
55 benchmark::DoNotOptimize(&c);
56 benchmark::DoNotOptimize(&in);
57 while (st.KeepRunning()) {
58 for (auto it = in.begin(); it != end; ++it) {
59 benchmark::DoNotOptimize(&(*c.insert(*it).first));
60 }
61 benchmark::ClobberMemory();
62 }
63}
64
65
66template <class Container, class GenInputs>
67void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000068 auto in = gen(st.range(0));
Eric Fiselierb658af22016-07-24 06:22:25 +000069 const auto end = in.end();
70 c.insert(in.begin(), in.end());
71 benchmark::DoNotOptimize(&c);
72 benchmark::DoNotOptimize(&in);
73 while (st.KeepRunning()) {
74 for (auto it = in.begin(); it != end; ++it) {
75 benchmark::DoNotOptimize(&(*c.emplace(*it).first));
76 }
77 benchmark::ClobberMemory();
78 }
79}
80
Eric Fiselier9e3e1372016-07-19 23:07:03 +000081template <class Container, class GenInputs>
82static void BM_Find(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000083 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +000084 c.insert(in.begin(), in.end());
85 benchmark::DoNotOptimize(&(*c.begin()));
86 const auto end = in.data() + in.size();
87 while (st.KeepRunning()) {
88 for (auto it = in.data(); it != end; ++it) {
89 benchmark::DoNotOptimize(&(*c.find(*it)));
90 }
91 benchmark::ClobberMemory();
92 }
93}
94
95template <class Container, class GenInputs>
96static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) {
97 c.rehash(8);
Eric Fiseliere5e33e42016-08-09 18:56:48 +000098 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +000099 c.insert(in.begin(), in.end());
100 benchmark::DoNotOptimize(&(*c.begin()));
101 const auto end = in.data() + in.size();
102 while (st.KeepRunning()) {
103 for (auto it = in.data(); it != end; ++it) {
104 benchmark::DoNotOptimize(&(*c.find(*it)));
105 }
106 benchmark::ClobberMemory();
107 }
Eric Fiselier9e3e1372016-07-19 23:07:03 +0000108}
109
110} // end namespace ContainerBenchmarks
111
112#endif // BENCHMARK_CONTAINER_BENCHMARKS_HPP