From 12ec532aa1a9a01a8841f344562d718dc0079612 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 9 May 2019 11:02:22 +0700 Subject: [PATCH] add simple lookup bench --- scripts/bench_map_lookup.sh | 8 ++++ scripts/bench_set_lookup.sh | 8 ++++ unbench/bench_base.hpp | 12 +++++ unbench/map_lookup_bench.cpp | 90 ++++++++++++++++++++++++++++++++++++ unbench/set_lookup_bench.cpp | 90 ++++++++++++++++++++++++++++++++++++ 5 files changed, 208 insertions(+) create mode 100755 scripts/bench_map_lookup.sh create mode 100755 scripts/bench_set_lookup.sh create mode 100644 unbench/map_lookup_bench.cpp create mode 100644 unbench/set_lookup_bench.cpp 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);