blob: f64869adc99dfee518ad7b627e0f0584e18961d9 [file] [log] [blame]
Eric Fiselierc52db212019-08-12 07:51:05 +00001// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
Nico Weberfa647f82019-08-21 01:59:12 +000010#ifndef BENCHMARK_CONTAINER_BENCHMARKS_H
11#define BENCHMARK_CONTAINER_BENCHMARKS_H
Eric Fiselier9e3e1372016-07-19 23:07:03 +000012
13#include <cassert>
14
Nico Weberfa647f82019-08-21 01:59:12 +000015#include "Utilities.h"
Eric Fiselier87038cd2018-01-18 04:23:01 +000016#include "benchmark/benchmark.h"
Eric Fiselier9e3e1372016-07-19 23:07:03 +000017
18namespace ContainerBenchmarks {
19
Eric Fiseliere7afbd32019-07-28 04:37:02 +000020template <class Container>
21void BM_ConstructSize(benchmark::State& st, Container) {
22 auto size = st.range(0);
23 for (auto _ : st) {
24 Container c(size);
Eric Fiselierc52db212019-08-12 07:51:05 +000025 DoNotOptimizeData(c);
Eric Fiseliere7afbd32019-07-28 04:37:02 +000026 }
27}
28
29template <class Container>
30void BM_ConstructSizeValue(benchmark::State& st, Container, typename Container::value_type const& val) {
31 const auto size = st.range(0);
32 for (auto _ : st) {
33 Container c(size, val);
Eric Fiselierc52db212019-08-12 07:51:05 +000034 DoNotOptimizeData(c);
Eric Fiseliere7afbd32019-07-28 04:37:02 +000035 }
36}
Eric Fiseliera9a1d392016-07-24 06:51:55 +000037
38template <class Container, class GenInputs>
39void BM_ConstructIterIter(benchmark::State& st, Container, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000040 auto in = gen(st.range(0));
Sebastian Pop07bb2852016-10-14 00:07:57 +000041 const auto begin = in.begin();
Eric Fiseliera9a1d392016-07-24 06:51:55 +000042 const auto end = in.end();
43 benchmark::DoNotOptimize(&in);
44 while (st.KeepRunning()) {
Sebastian Pop07bb2852016-10-14 00:07:57 +000045 Container c(begin, end);
Eric Fiselierc52db212019-08-12 07:51:05 +000046 DoNotOptimizeData(c);
Eric Fiseliera9a1d392016-07-24 06:51:55 +000047 }
48}
49
Eric Fiselier9e3e1372016-07-19 23:07:03 +000050template <class Container, class GenInputs>
51void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000052 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +000053 const auto end = in.end();
54 while (st.KeepRunning()) {
55 c.clear();
56 for (auto it = in.begin(); it != end; ++it) {
57 benchmark::DoNotOptimize(&(*c.insert(*it).first));
58 }
59 benchmark::ClobberMemory();
60 }
61}
62
63template <class Container, class GenInputs>
64void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000065 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +000066 const auto end = in.end();
67 while (st.KeepRunning()) {
68 c.clear();
69 c.rehash(16);
70 for (auto it = in.begin(); it != end; ++it) {
71 benchmark::DoNotOptimize(&(*c.insert(*it).first));
72 }
73 benchmark::ClobberMemory();
74 }
75}
76
Eric Fiselierb658af22016-07-24 06:22:25 +000077
78template <class Container, class GenInputs>
79void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000080 auto in = gen(st.range(0));
Eric Fiselierb658af22016-07-24 06:22:25 +000081 const auto end = in.end();
82 c.insert(in.begin(), in.end());
83 benchmark::DoNotOptimize(&c);
84 benchmark::DoNotOptimize(&in);
85 while (st.KeepRunning()) {
86 for (auto it = in.begin(); it != end; ++it) {
87 benchmark::DoNotOptimize(&(*c.insert(*it).first));
88 }
89 benchmark::ClobberMemory();
90 }
91}
92
93
94template <class Container, class GenInputs>
95void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +000096 auto in = gen(st.range(0));
Eric Fiselierb658af22016-07-24 06:22:25 +000097 const auto end = in.end();
98 c.insert(in.begin(), in.end());
99 benchmark::DoNotOptimize(&c);
100 benchmark::DoNotOptimize(&in);
101 while (st.KeepRunning()) {
102 for (auto it = in.begin(); it != end; ++it) {
103 benchmark::DoNotOptimize(&(*c.emplace(*it).first));
104 }
105 benchmark::ClobberMemory();
106 }
107}
108
Eric Fiselier9e3e1372016-07-19 23:07:03 +0000109template <class Container, class GenInputs>
110static void BM_Find(benchmark::State& st, Container c, GenInputs gen) {
Eric Fiseliere5e33e42016-08-09 18:56:48 +0000111 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +0000112 c.insert(in.begin(), in.end());
113 benchmark::DoNotOptimize(&(*c.begin()));
114 const auto end = in.data() + in.size();
115 while (st.KeepRunning()) {
116 for (auto it = in.data(); it != end; ++it) {
117 benchmark::DoNotOptimize(&(*c.find(*it)));
118 }
119 benchmark::ClobberMemory();
120 }
121}
122
123template <class Container, class GenInputs>
124static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) {
125 c.rehash(8);
Eric Fiseliere5e33e42016-08-09 18:56:48 +0000126 auto in = gen(st.range(0));
Eric Fiselier9e3e1372016-07-19 23:07:03 +0000127 c.insert(in.begin(), in.end());
128 benchmark::DoNotOptimize(&(*c.begin()));
129 const auto end = in.data() + in.size();
130 while (st.KeepRunning()) {
131 for (auto it = in.data(); it != end; ++it) {
132 benchmark::DoNotOptimize(&(*c.find(*it)));
133 }
134 benchmark::ClobberMemory();
135 }
Eric Fiselier9e3e1372016-07-19 23:07:03 +0000136}
137
Ivan Trofimovb6bc7462022-07-10 11:41:02 +0200138template <class Container, class GenInputs>
139static void BM_Rehash(benchmark::State& st, Container c, GenInputs gen) {
140 auto in = gen(st.range(0));
141 c.max_load_factor(3.0);
142 c.insert(in.begin(), in.end());
143 benchmark::DoNotOptimize(c);
144 const auto bucket_count = c.bucket_count();
145 while (st.KeepRunning()) {
146 c.rehash(bucket_count + 1);
147 c.rehash(bucket_count);
148 benchmark::ClobberMemory();
149 }
150}
151
Eric Fiselier9e3e1372016-07-19 23:07:03 +0000152} // end namespace ContainerBenchmarks
153
Nico Weberfa647f82019-08-21 01:59:12 +0000154#endif // BENCHMARK_CONTAINER_BENCHMARKS_H