diff --git a/benchmarks/BM_mapVsArray.cpp b/benchmarks/BM_mapVsArray.cpp new file mode 100644 index 00000000..59e62b27 --- /dev/null +++ b/benchmarks/BM_mapVsArray.cpp @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#include +#include +#include +#include +#include "../src/sfizz/CCMap.h" +#include +#include + +constexpr int maxCC { 256 }; + +class MyFixture : public benchmark::Fixture { +public: + void SetUp(const ::benchmark::State& state) + { + std::random_device rd {}; + std::mt19937 gen { rd() }; + + std::array sourceCC; + absl::c_iota(sourceCC, 0); + absl::c_shuffle(sourceCC, gen); + ccs.resize(state.range(0)); + std::copy(sourceCC.begin(), sourceCC.begin() + state.range(0), ccs.begin()); + std::uniform_real_distribution distFloat { 0.1f, 1.0f }; + vector.resize(maxCC); + absl::c_generate(vector, [&]() { + return distFloat(gen); + }); + for (unsigned i = 0; i < state.range(0); ++i) { + map[ccs[i]] = vector[ccs[i]]; + } + } + + void TearDown(const ::benchmark::State& /* state */) + { + } + + std::vector ccs; + std::vector vector; + sfz::CCMap map { 1 }; +}; + +BENCHMARK_DEFINE_F(MyFixture, ArraySearch) +(benchmark::State& state) +{ + float value { 1 }; + for (auto _ : state) { + for (unsigned i = 0; i < state.range(0); ++i) { + value *= vector[ccs[i]]; + } + benchmark::DoNotOptimize(value); + } +} + +BENCHMARK_DEFINE_F(MyFixture, MapSearch) +(benchmark::State& state) +{ + float value { 0 }; + for (auto _ : state) { + for (unsigned i = 0; i < state.range(0); ++i) { + value *= map[ccs[i]]; + } + benchmark::DoNotOptimize(value); + } +} + +BENCHMARK_REGISTER_F(MyFixture, ArraySearch)->Range(4, maxCC); +BENCHMARK_REGISTER_F(MyFixture, MapSearch)->Range(4, maxCC); +BENCHMARK_MAIN(); diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 0aa090ae..fb666f0c 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -63,6 +63,7 @@ sfizz_add_benchmark(bm_interpolationCast BM_interpolationCast.cpp) sfizz_add_benchmark(bm_pointerIterationOrOffsets BM_pointerIterationOrOffsets.cpp) sfizz_add_benchmark(bm_maps BM_maps.cpp) target_link_libraries(bm_maps PRIVATE absl::flat_hash_map) +sfizz_add_benchmark(bm_mapVsArray BM_mapVsArray.cpp) sfizz_add_benchmark(bm_logger BM_logger.cpp) target_link_libraries(bm_logger PRIVATE sfizz::sfizz)