146035553Spatrick // -*- C++ -*-
246035553Spatrick //===----------------------------------------------------------------------===//
346035553Spatrick //
446035553Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick // See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick //
846035553Spatrick //===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick #ifndef BENCHMARK_CONTAINER_BENCHMARKS_H
1146035553Spatrick #define BENCHMARK_CONTAINER_BENCHMARKS_H
1246035553Spatrick
1346035553Spatrick #include <cassert>
1446035553Spatrick
1546035553Spatrick #include "Utilities.h"
1646035553Spatrick #include "benchmark/benchmark.h"
1746035553Spatrick
1846035553Spatrick namespace ContainerBenchmarks {
1946035553Spatrick
2046035553Spatrick template <class Container>
BM_ConstructSize(benchmark::State & st,Container)2146035553Spatrick void BM_ConstructSize(benchmark::State& st, Container) {
2246035553Spatrick auto size = st.range(0);
2346035553Spatrick for (auto _ : st) {
2446035553Spatrick Container c(size);
2546035553Spatrick DoNotOptimizeData(c);
2646035553Spatrick }
2746035553Spatrick }
2846035553Spatrick
2946035553Spatrick template <class Container>
BM_ConstructSizeValue(benchmark::State & st,Container,typename Container::value_type const & val)3046035553Spatrick void BM_ConstructSizeValue(benchmark::State& st, Container, typename Container::value_type const& val) {
3146035553Spatrick const auto size = st.range(0);
3246035553Spatrick for (auto _ : st) {
3346035553Spatrick Container c(size, val);
3446035553Spatrick DoNotOptimizeData(c);
3546035553Spatrick }
3646035553Spatrick }
3746035553Spatrick
3846035553Spatrick template <class Container, class GenInputs>
BM_ConstructIterIter(benchmark::State & st,Container,GenInputs gen)3946035553Spatrick void BM_ConstructIterIter(benchmark::State& st, Container, GenInputs gen) {
4046035553Spatrick auto in = gen(st.range(0));
4146035553Spatrick const auto begin = in.begin();
4246035553Spatrick const auto end = in.end();
4346035553Spatrick benchmark::DoNotOptimize(&in);
4446035553Spatrick while (st.KeepRunning()) {
4546035553Spatrick Container c(begin, end);
4646035553Spatrick DoNotOptimizeData(c);
4746035553Spatrick }
4846035553Spatrick }
4946035553Spatrick
5046035553Spatrick template <class Container, class GenInputs>
BM_InsertValue(benchmark::State & st,Container c,GenInputs gen)5146035553Spatrick void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) {
5246035553Spatrick auto in = gen(st.range(0));
5346035553Spatrick const auto end = in.end();
5446035553Spatrick while (st.KeepRunning()) {
5546035553Spatrick c.clear();
5646035553Spatrick for (auto it = in.begin(); it != end; ++it) {
5746035553Spatrick benchmark::DoNotOptimize(&(*c.insert(*it).first));
5846035553Spatrick }
5946035553Spatrick benchmark::ClobberMemory();
6046035553Spatrick }
6146035553Spatrick }
6246035553Spatrick
6346035553Spatrick template <class Container, class GenInputs>
BM_InsertValueRehash(benchmark::State & st,Container c,GenInputs gen)6446035553Spatrick void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
6546035553Spatrick auto in = gen(st.range(0));
6646035553Spatrick const auto end = in.end();
6746035553Spatrick while (st.KeepRunning()) {
6846035553Spatrick c.clear();
6946035553Spatrick c.rehash(16);
7046035553Spatrick for (auto it = in.begin(); it != end; ++it) {
7146035553Spatrick benchmark::DoNotOptimize(&(*c.insert(*it).first));
7246035553Spatrick }
7346035553Spatrick benchmark::ClobberMemory();
7446035553Spatrick }
7546035553Spatrick }
7646035553Spatrick
7746035553Spatrick
7846035553Spatrick template <class Container, class GenInputs>
BM_InsertDuplicate(benchmark::State & st,Container c,GenInputs gen)7946035553Spatrick void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
8046035553Spatrick auto in = gen(st.range(0));
8146035553Spatrick const auto end = in.end();
8246035553Spatrick c.insert(in.begin(), in.end());
8346035553Spatrick benchmark::DoNotOptimize(&c);
8446035553Spatrick benchmark::DoNotOptimize(&in);
8546035553Spatrick while (st.KeepRunning()) {
8646035553Spatrick for (auto it = in.begin(); it != end; ++it) {
8746035553Spatrick benchmark::DoNotOptimize(&(*c.insert(*it).first));
8846035553Spatrick }
8946035553Spatrick benchmark::ClobberMemory();
9046035553Spatrick }
9146035553Spatrick }
9246035553Spatrick
9346035553Spatrick
9446035553Spatrick template <class Container, class GenInputs>
BM_EmplaceDuplicate(benchmark::State & st,Container c,GenInputs gen)9546035553Spatrick void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) {
9646035553Spatrick auto in = gen(st.range(0));
9746035553Spatrick const auto end = in.end();
9846035553Spatrick c.insert(in.begin(), in.end());
9946035553Spatrick benchmark::DoNotOptimize(&c);
10046035553Spatrick benchmark::DoNotOptimize(&in);
10146035553Spatrick while (st.KeepRunning()) {
10246035553Spatrick for (auto it = in.begin(); it != end; ++it) {
10346035553Spatrick benchmark::DoNotOptimize(&(*c.emplace(*it).first));
10446035553Spatrick }
10546035553Spatrick benchmark::ClobberMemory();
10646035553Spatrick }
10746035553Spatrick }
10846035553Spatrick
10946035553Spatrick template <class Container, class GenInputs>
BM_Find(benchmark::State & st,Container c,GenInputs gen)11046035553Spatrick static void BM_Find(benchmark::State& st, Container c, GenInputs gen) {
11146035553Spatrick auto in = gen(st.range(0));
11246035553Spatrick c.insert(in.begin(), in.end());
11346035553Spatrick benchmark::DoNotOptimize(&(*c.begin()));
11446035553Spatrick const auto end = in.data() + in.size();
11546035553Spatrick while (st.KeepRunning()) {
11646035553Spatrick for (auto it = in.data(); it != end; ++it) {
11746035553Spatrick benchmark::DoNotOptimize(&(*c.find(*it)));
11846035553Spatrick }
11946035553Spatrick benchmark::ClobberMemory();
12046035553Spatrick }
12146035553Spatrick }
12246035553Spatrick
12346035553Spatrick template <class Container, class GenInputs>
BM_FindRehash(benchmark::State & st,Container c,GenInputs gen)12446035553Spatrick static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) {
12546035553Spatrick c.rehash(8);
12646035553Spatrick auto in = gen(st.range(0));
12746035553Spatrick c.insert(in.begin(), in.end());
12846035553Spatrick benchmark::DoNotOptimize(&(*c.begin()));
12946035553Spatrick const auto end = in.data() + in.size();
13046035553Spatrick while (st.KeepRunning()) {
13146035553Spatrick for (auto it = in.data(); it != end; ++it) {
13246035553Spatrick benchmark::DoNotOptimize(&(*c.find(*it)));
13346035553Spatrick }
13446035553Spatrick benchmark::ClobberMemory();
13546035553Spatrick }
13646035553Spatrick }
13746035553Spatrick
138*4bdff4beSrobert template <class Container, class GenInputs>
BM_Rehash(benchmark::State & st,Container c,GenInputs gen)139*4bdff4beSrobert static void BM_Rehash(benchmark::State& st, Container c, GenInputs gen) {
140*4bdff4beSrobert auto in = gen(st.range(0));
141*4bdff4beSrobert c.max_load_factor(3.0);
142*4bdff4beSrobert c.insert(in.begin(), in.end());
143*4bdff4beSrobert benchmark::DoNotOptimize(c);
144*4bdff4beSrobert const auto bucket_count = c.bucket_count();
145*4bdff4beSrobert while (st.KeepRunning()) {
146*4bdff4beSrobert c.rehash(bucket_count + 1);
147*4bdff4beSrobert c.rehash(bucket_count);
148*4bdff4beSrobert benchmark::ClobberMemory();
149*4bdff4beSrobert }
150*4bdff4beSrobert }
151*4bdff4beSrobert
15246035553Spatrick } // end namespace ContainerBenchmarks
15346035553Spatrick
15446035553Spatrick #endif // BENCHMARK_CONTAINER_BENCHMARKS_H
155