diff --git a/scripts/bench_map_foreach.sh b/scripts/bench_map_foreach.sh new file mode 100755 index 0000000..6b2860b --- /dev/null +++ b/scripts/bench_map_foreach.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_foreach --benchmark_format=csv > benchmark_map_foreach.csv +../scripts/bench_drawer.py -f benchmark_map_foreach.csv diff --git a/scripts/bench_set_foreach.sh b/scripts/bench_set_foreach.sh new file mode 100755 index 0000000..dc6e906 --- /dev/null +++ b/scripts/bench_set_foreach.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_foreach --benchmark_format=csv > benchmark_set_foreach.csv +../scripts/bench_drawer.py -f benchmark_set_foreach.csv diff --git a/unbench/map_foreach_bench.cpp b/unbench/map_foreach_bench.cpp new file mode 100644 index 0000000..db680b1 --- /dev/null +++ b/unbench/map_foreach_bench.cpp @@ -0,0 +1,94 @@ +/******************************************************************************* + * 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_foreach(benchmark::State& state) { + std::vector> v; + generate_random_vector(state.range(), v); + flat_map s(v.begin(), v.end()); + for ( auto _ : state ) { + int acc = 0; + for ( const auto& e : s ) { + acc += e.second.x; + } + benchmark::DoNotOptimize(acc); + } + } + +#ifdef BOOST_CONTAINER_FOUND + template < typename Value > + void boost_flat_map_foreach(benchmark::State& state) { + std::vector> v; + generate_random_vector(state.range(), v); + boost::container::flat_map s(v.begin(), v.end()); + for ( auto _ : state ) { + int acc = 0; + for ( const auto& e : s ) { + acc += e.second.x; + } + benchmark::DoNotOptimize(acc); + } + } +#endif + + template < typename Value > + void std_map_foreach(benchmark::State& state) { + std::vector> v; + generate_random_vector(state.range(), v); + std::map s(v.begin(), v.end()); + for ( auto _ : state ) { + int acc = 0; + for ( const auto& e : s ) { + acc += e.second.x; + } + benchmark::DoNotOptimize(acc); + } + } + + template < typename Value > + void std_unordered_map_foreach(benchmark::State& state) { + std::vector> v; + generate_random_vector(state.range(), v); + std::unordered_map s(v.begin(), v.end()); + for ( auto _ : state ) { + int acc = 0; + for ( const auto& e : s ) { + acc += e.second.x; + } + benchmark::DoNotOptimize(acc); + } + } +} + +BENCHMARK_TEMPLATE(flat_map_foreach, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); + +#ifdef BOOST_CONTAINER_FOUND + BENCHMARK_TEMPLATE(boost_flat_map_foreach, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); +#endif + +BENCHMARK_TEMPLATE(std_map_foreach, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); + +BENCHMARK_TEMPLATE(std_unordered_map_foreach, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); diff --git a/unbench/set_foreach_bench.cpp b/unbench/set_foreach_bench.cpp new file mode 100644 index 0000000..18ccbdf --- /dev/null +++ b/unbench/set_foreach_bench.cpp @@ -0,0 +1,94 @@ +/******************************************************************************* + * 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_foreach(benchmark::State& state) { + std::vector v; + generate_random_vector(state.range(), v); + flat_set s(v.begin(), v.end()); + for ( auto _ : state ) { + int acc = 0; + for ( const auto& e : s ) { + acc += e.x; + } + benchmark::DoNotOptimize(acc); + } + } + +#ifdef BOOST_CONTAINER_FOUND + template < typename Value > + void boost_flat_set_foreach(benchmark::State& state) { + std::vector v; + generate_random_vector(state.range(), v); + boost::container::flat_set s(v.begin(), v.end()); + for ( auto _ : state ) { + int acc = 0; + for ( const auto& e : s ) { + acc += e.x; + } + benchmark::DoNotOptimize(acc); + } + } +#endif + + template < typename Value > + void std_set_foreach(benchmark::State& state) { + std::vector v; + generate_random_vector(state.range(), v); + std::set s(v.begin(), v.end()); + for ( auto _ : state ) { + int acc = 0; + for ( const auto& e : s ) { + acc += e.x; + } + benchmark::DoNotOptimize(acc); + } + } + + template < typename Value > + void std_unordered_set_foreach(benchmark::State& state) { + std::vector v; + generate_random_vector(state.range(), v); + std::unordered_set s(v.begin(), v.end()); + for ( auto _ : state ) { + int acc = 0; + for ( const auto& e : s ) { + acc += e.x; + } + benchmark::DoNotOptimize(acc); + } + } +} + +BENCHMARK_TEMPLATE(flat_set_foreach, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); + +#ifdef BOOST_CONTAINER_FOUND + BENCHMARK_TEMPLATE(boost_flat_set_foreach, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); +#endif + +BENCHMARK_TEMPLATE(std_set_foreach, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50); + +BENCHMARK_TEMPLATE(std_unordered_set_foreach, vec4) + ->ComputeStatistics("min", min_bench_statistics) + ->DenseRange(1,401,50);