diff --git a/scripts/bench_map_lookup.sh b/scripts/bench_map_lookup.sh new file mode 100755 index 0000000..30d5120 --- /dev/null +++ b/scripts/bench_map_lookup.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -e + +BUILD_DIR=`dirname "$BASH_SOURCE"`/../build +cd $BUILD_DIR + +./unbench/flat.hpp.unbench --benchmark_filter=_map_lookup --benchmark_format=csv > benchmark_map_lookup.csv +../scripts/bench_drawer.py -f benchmark_map_lookup.csv diff --git a/scripts/bench_set_lookup.sh b/scripts/bench_set_lookup.sh new file mode 100755 index 0000000..f96e5cd --- /dev/null +++ b/scripts/bench_set_lookup.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -e + +BUILD_DIR=`dirname "$BASH_SOURCE"`/../build +cd $BUILD_DIR + +./unbench/flat.hpp.unbench --benchmark_filter=_set_lookup --benchmark_format=csv > benchmark_set_lookup.csv +../scripts/bench_drawer.py -f benchmark_set_lookup.csv diff --git a/unbench/bench_base.hpp b/unbench/bench_base.hpp index cf53719..fdf2af5 100644 --- a/unbench/bench_base.hpp +++ b/unbench/bench_base.hpp @@ -94,6 +94,18 @@ namespace flat_hpp_unbench v = std::move(nv); } + inline void generate_random_vector(std::size_t n, std::vector>& v) { + std::mt19937 engine(n); + std::uniform_int_distribution dist; + + std::vector> nv(n); + for ( std::size_t i = 0; i < n; ++i ) { + nv[i] = std::make_pair(dist(engine), dist(engine)); + } + + v = std::move(nv); + } + inline double min_bench_statistics(const std::vector& v) { return v.empty() ? 0.0 diff --git a/unbench/map_lookup_bench.cpp b/unbench/map_lookup_bench.cpp new file mode 100644 index 0000000..04d43d8 --- /dev/null +++ b/unbench/map_lookup_bench.cpp @@ -0,0 +1,90 @@ +/******************************************************************************* + * This file is part of the "https://github.com/blackmatov/flat.hpp" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2019, by Matvey Cherevko (blackmatov@gmail.com) + ******************************************************************************/ + +#include "bench_base.hpp" +using namespace flat_hpp_unbench; + +#include +using namespace flat_hpp; + +#ifdef BOOST_CONTAINER_FOUND +# include +#endif + +namespace +{ + template < typename Value > + void flat_map_lookup(benchmark::State& state) { + std::vector> v; + generate_random_vector(state.range(), v); + flat_map s(v.begin(), v.end()); + for ( auto _ : state ) { + for ( auto e : v ) { + benchmark::DoNotOptimize(s.find(e.first)); + benchmark::DoNotOptimize(s.find(e.second)); + } + } + } + +#ifdef BOOST_CONTAINER_FOUND + template < typename Value > + void boost_flat_map_lookup(benchmark::State& state) { + std::vector> v; + generate_random_vector(state.range(), v); + boost::container::flat_map s(v.begin(), v.end()); + for ( auto _ : state ) { + for ( auto e : v ) { + benchmark::DoNotOptimize(s.find(e.first)); + benchmark::DoNotOptimize(s.find(e.second)); + } + } + } +#endif + + template < typename Value > + void std_map_lookup(benchmark::State& state) { + std::vector> v; + generate_random_vector(state.range(), v); + std::map s(v.begin(), v.end()); + for ( auto _ : state ) { + for ( auto e : v ) { + benchmark::DoNotOptimize(s.find(e.first)); + benchmark::DoNotOptimize(s.find(e.second)); + } + } + } + + template < typename Value > + void std_unordered_map_lookup(benchmark::State& state) { + std::vector> v; + generate_random_vector(state.range(), v); + std::unordered_map s(v.begin(), v.end()); + for ( auto _ : state ) { + for ( auto e : v ) { + benchmark::DoNotOptimize(s.find(e.first)); + benchmark::DoNotOptimize(s.find(e.second)); + } + } + } +} + +BENCHMARK_TEMPLATE(flat_map_lookup, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); + +#ifdef BOOST_CONTAINER_FOUND + BENCHMARK_TEMPLATE(boost_flat_map_lookup, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); +#endif + +BENCHMARK_TEMPLATE(std_map_lookup, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); + +BENCHMARK_TEMPLATE(std_unordered_map_lookup, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); diff --git a/unbench/set_lookup_bench.cpp b/unbench/set_lookup_bench.cpp new file mode 100644 index 0000000..11810a7 --- /dev/null +++ b/unbench/set_lookup_bench.cpp @@ -0,0 +1,90 @@ +/******************************************************************************* + * This file is part of the "https://github.com/blackmatov/flat.hpp" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2019, by Matvey Cherevko (blackmatov@gmail.com) + ******************************************************************************/ + +#include "bench_base.hpp" +using namespace flat_hpp_unbench; + +#include +using namespace flat_hpp; + +#ifdef BOOST_CONTAINER_FOUND +# include +#endif + +namespace +{ + template < typename Value > + void flat_set_lookup(benchmark::State& state) { + std::vector v; + generate_random_vector(state.range(), v); + flat_set s(v.begin(), v.end()); + for ( auto _ : state ) { + for ( auto e : v ) { + benchmark::DoNotOptimize(s.find(e)); + benchmark::DoNotOptimize(s.find(e * 2)); + } + } + } + +#ifdef BOOST_CONTAINER_FOUND + template < typename Value > + void boost_flat_set_lookup(benchmark::State& state) { + std::vector v; + generate_random_vector(state.range(), v); + boost::container::flat_set s(v.begin(), v.end()); + for ( auto _ : state ) { + for ( auto e : v ) { + benchmark::DoNotOptimize(s.find(e)); + benchmark::DoNotOptimize(s.find(e * 2)); + } + } + } +#endif + + template < typename Value > + void std_set_lookup(benchmark::State& state) { + std::vector v; + generate_random_vector(state.range(), v); + std::set s(v.begin(), v.end()); + for ( auto _ : state ) { + for ( auto e : v ) { + benchmark::DoNotOptimize(s.find(e)); + benchmark::DoNotOptimize(s.find(e * 2)); + } + } + } + + template < typename Value > + void std_unordered_set_lookup(benchmark::State& state) { + std::vector v; + generate_random_vector(state.range(), v); + std::unordered_set s(v.begin(), v.end()); + for ( auto _ : state ) { + for ( auto e : v ) { + benchmark::DoNotOptimize(s.find(e)); + benchmark::DoNotOptimize(s.find(e * 2)); + } + } + } +} + +BENCHMARK_TEMPLATE(flat_set_lookup, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); + +#ifdef BOOST_CONTAINER_FOUND + BENCHMARK_TEMPLATE(boost_flat_set_lookup, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); +#endif + +BENCHMARK_TEMPLATE(std_set_lookup, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); + +BENCHMARK_TEMPLATE(std_unordered_set_lookup, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50);