// Copyright 2015-2019 Hans Dembinski // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include "../test/throw_exception.hpp" #include "../test/utility_histogram.hpp" #include "generator.hpp" #include struct assert_check { assert_check() { BOOST_ASSERT(false); // don't run with asserts enabled } } _; using SStore = std::vector; // make benchmark compatible with older versions of the library #if __has_include() #include using DStore = boost::histogram::unlimited_storage<>; #else #include using DStore = boost::histogram::adaptive_storage<>; #endif using namespace boost::histogram; using reg = axis::regular<>; template static void fill_1d(benchmark::State& state) { auto h = make_s(Tag(), Storage(), reg(100, 0, 1)); auto gen = generator(); for (auto _ : state) benchmark::DoNotOptimize(h(gen())); state.SetItemsProcessed(state.iterations()); } template static void fill_n_1d(benchmark::State& state) { auto h = make_s(Tag(), Storage(), reg(100, 0, 1)); auto gen = generator(); for (auto _ : state) h.fill(gen); state.SetItemsProcessed(state.iterations() * gen.size()); } template static void fill_2d(benchmark::State& state) { auto h = make_s(Tag(), Storage(), reg(100, 0, 1), reg(100, 0, 1)); auto gen = generator(); for (auto _ : state) benchmark::DoNotOptimize(h(gen(), gen())); state.SetItemsProcessed(state.iterations() * 2); } template static void fill_n_2d(benchmark::State& state) { auto h = make_s(Tag(), Storage(), reg(100, 0, 1), reg(100, 0, 1)); auto gen = generator(); auto v = {gen, gen}; for (auto _ : state) h.fill(v); state.SetItemsProcessed(state.iterations() * 2 * gen.size()); } template static void fill_3d(benchmark::State& state) { auto h = make_s(Tag(), Storage(), reg(100, 0, 1), reg(100, 0, 1), reg(100, 0, 1)); auto gen = generator(); for (auto _ : state) benchmark::DoNotOptimize(h(gen(), gen(), gen())); state.SetItemsProcessed(state.iterations() * 3); } template static void fill_n_3d(benchmark::State& state) { auto h = make_s(Tag(), Storage(), reg(100, 0, 1), reg(100, 0, 1), reg(100, 0, 1)); auto gen = generator(); auto v = {gen, gen, gen}; for (auto _ : state) h.fill(v); state.SetItemsProcessed(state.iterations() * 3 * gen.size()); } template static void fill_6d(benchmark::State& state) { auto h = make_s(Tag(), Storage(), reg(10, 0, 1), reg(10, 0, 1), reg(10, 0, 1), reg(10, 0, 1), reg(10, 0, 1), reg(10, 0, 1)); auto gen = generator(); for (auto _ : state) benchmark::DoNotOptimize(h(gen(), gen(), gen(), gen(), gen(), gen())); state.SetItemsProcessed(state.iterations() * 6); } template static void fill_n_6d(benchmark::State& state) { auto h = make_s(Tag(), Storage(), reg(10, 0, 1), reg(10, 0, 1), reg(10, 0, 1), reg(10, 0, 1), reg(10, 0, 1), reg(10, 0, 1)); auto gen = generator(); auto v = {gen, gen, gen, gen, gen, gen}; for (auto _ : state) h.fill(v); state.SetItemsProcessed(state.iterations() * 6 * gen.size()); } BENCHMARK_TEMPLATE(fill_1d, uniform, static_tag); // BENCHMARK_TEMPLATE(fill_1d, uniform, static_tag, DStore); BENCHMARK_TEMPLATE(fill_1d, normal, static_tag); // BENCHMARK_TEMPLATE(fill_1d, normal, static_tag, DStore); BENCHMARK_TEMPLATE(fill_1d, uniform, dynamic_tag); // BENCHMARK_TEMPLATE(fill_1d, uniform, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_1d, normal, dynamic_tag); // BENCHMARK_TEMPLATE(fill_1d, normal, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_n_1d, uniform, static_tag); // BENCHMARK_TEMPLATE(fill_n_1d, uniform, static_tag, DStore); BENCHMARK_TEMPLATE(fill_n_1d, normal, static_tag); // BENCHMARK_TEMPLATE(fill_n_1d, normal, static_tag, DStore); BENCHMARK_TEMPLATE(fill_n_1d, uniform, dynamic_tag); // BENCHMARK_TEMPLATE(fill_n_1d, uniform, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_n_1d, normal, dynamic_tag); // BENCHMARK_TEMPLATE(fill_n_1d, normal, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_2d, uniform, static_tag); // BENCHMARK_TEMPLATE(fill_2d, uniform, static_tag, DStore); BENCHMARK_TEMPLATE(fill_2d, normal, static_tag); // BENCHMARK_TEMPLATE(fill_2d, normal, static_tag, DStore); BENCHMARK_TEMPLATE(fill_2d, uniform, dynamic_tag); // BENCHMARK_TEMPLATE(fill_2d, uniform, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_2d, normal, dynamic_tag); // BENCHMARK_TEMPLATE(fill_2d, normal, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_n_2d, uniform, static_tag); // BENCHMARK_TEMPLATE(fill_n_2d, uniform, static_tag, DStore); BENCHMARK_TEMPLATE(fill_n_2d, normal, static_tag); // BENCHMARK_TEMPLATE(fill_n_2d, normal, static_tag, DStore); BENCHMARK_TEMPLATE(fill_n_2d, uniform, dynamic_tag); // BENCHMARK_TEMPLATE(fill_n_2d, uniform, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_n_2d, normal, dynamic_tag); // BENCHMARK_TEMPLATE(fill_n_2d, normal, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_3d, uniform, static_tag); // BENCHMARK_TEMPLATE(fill_3d, uniform, static_tag, DStore); BENCHMARK_TEMPLATE(fill_3d, normal, static_tag); // BENCHMARK_TEMPLATE(fill_3d, normal, static_tag, DStore); BENCHMARK_TEMPLATE(fill_3d, uniform, dynamic_tag); // BENCHMARK_TEMPLATE(fill_3d, uniform, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_3d, normal, dynamic_tag); // BENCHMARK_TEMPLATE(fill_3d, normal, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_n_3d, uniform, static_tag); // BENCHMARK_TEMPLATE(fill_n_3d, uniform, static_tag, DStore); BENCHMARK_TEMPLATE(fill_n_3d, normal, static_tag); // BENCHMARK_TEMPLATE(fill_n_3d, normal, static_tag, DStore); BENCHMARK_TEMPLATE(fill_n_3d, uniform, dynamic_tag); // BENCHMARK_TEMPLATE(fill_n_3d, uniform, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_n_3d, normal, dynamic_tag); // BENCHMARK_TEMPLATE(fill_n_3d, normal, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_6d, uniform, static_tag); // BENCHMARK_TEMPLATE(fill_6d, uniform, static_tag, DStore); BENCHMARK_TEMPLATE(fill_6d, normal, static_tag); // BENCHMARK_TEMPLATE(fill_6d, normal, static_tag, DStore); BENCHMARK_TEMPLATE(fill_6d, uniform, dynamic_tag); // BENCHMARK_TEMPLATE(fill_6d, uniform, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_6d, normal, dynamic_tag); // BENCHMARK_TEMPLATE(fill_6d, normal, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_n_6d, uniform, static_tag); // BENCHMARK_TEMPLATE(fill_n_6d, uniform, static_tag, DStore); BENCHMARK_TEMPLATE(fill_n_6d, normal, static_tag); // BENCHMARK_TEMPLATE(fill_n_6d, normal, static_tag, DStore); BENCHMARK_TEMPLATE(fill_n_6d, uniform, dynamic_tag); // BENCHMARK_TEMPLATE(fill_n_6d, uniform, dynamic_tag, DStore); BENCHMARK_TEMPLATE(fill_n_6d, normal, dynamic_tag); // BENCHMARK_TEMPLATE(fill_n_6d, normal, dynamic_tag, DStore);