diff --git a/benchmarks/BM_envelopes.cpp b/benchmarks/BM_envelopes.cpp new file mode 100644 index 00000000..70eb3fdd --- /dev/null +++ b/benchmarks/BM_envelopes.cpp @@ -0,0 +1,99 @@ +// Copyright (c) 2019, Paul Ferrand +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: + +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. + +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include +#include +#include +#include "EventEnvelopes.h" +#include "SIMDHelpers.h" +#include "absl/types/span.h" + +#include "FloatEnvelopes.cpp" + +class EnvelopeFixture : public benchmark::Fixture { +public: + void SetUp(const ::benchmark::State& state) + { + input = std::vector(state.range(0)); + output = std::vector(state.range(0)); + std::generate(input.begin(), input.end(), [&]() { return dist(gen); }); + sfz::cumsum(input, absl::MakeSpan(input)); + } + + void TearDown(const ::benchmark::State& state [[maybe_unused]]) + { + + } + std::random_device rd { }; + std::mt19937 gen { rd() }; + std::uniform_real_distribution dist { 1, 30 }; + std::vector input; + std::vector output; +}; + + +BENCHMARK_DEFINE_F(EnvelopeFixture, Linear)(benchmark::State& state) { + sfz::LinearEnvelope envelope; + for (auto _ : state) + { + envelope.registerEvent(state.range(0) - 1, dist(gen)); + envelope.getBlock(absl::MakeSpan(output)); + } +} + +BENCHMARK_DEFINE_F(EnvelopeFixture, LinearQuantized)(benchmark::State& state) { + sfz::LinearEnvelope envelope; + for (auto _ : state) + { + envelope.registerEvent(state.range(0) - 1, dist(gen)); + envelope.getQuantizedBlock(absl::MakeSpan(output), 0.5); + } +} + +BENCHMARK_DEFINE_F(EnvelopeFixture, Multiplicative)(benchmark::State& state) { + sfz::MultiplicativeEnvelope envelope; + for (auto _ : state) + { + envelope.registerEvent(state.range(0) - 1, dist(gen)); + envelope.getBlock(absl::MakeSpan(output)); + } +} + +BENCHMARK_DEFINE_F(EnvelopeFixture, MultiplicativeQuantized)(benchmark::State& state) { + sfz::MultiplicativeEnvelope envelope; + for (auto _ : state) + { + envelope.registerEvent(state.range(0) - 1, dist(gen)); + envelope.getQuantizedBlock(absl::MakeSpan(output), 1.5); + } +} + + +BENCHMARK_REGISTER_F(EnvelopeFixture, Linear)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_REGISTER_F(EnvelopeFixture, LinearQuantized)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_REGISTER_F(EnvelopeFixture, Multiplicative)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_REGISTER_F(EnvelopeFixture, MultiplicativeQuantized)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_MAIN(); \ No newline at end of file diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 0294a83c..f0e39621 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -113,6 +113,10 @@ add_executable(bm_resample BM_resample.cpp ${BENCHMARK_SIMD_SOURCES}) target_link_libraries(bm_resample benchmark absl::span absl::algorithm sndfile samplerate) target_include_directories(bm_resample PRIVATE ../src/sfizz ../src/external) +add_executable(bm_envelopes BM_envelopes.cpp ${BENCHMARK_SIMD_SOURCES}) +target_link_libraries(bm_envelopes benchmark absl::span absl::algorithm sndfile samplerate) +target_include_directories(bm_envelopes PRIVATE ../src/sfizz ../src/external) + add_custom_target(sfizz_benchmarks) add_dependencies(sfizz_benchmarks bm_opf_high_vs_low @@ -137,6 +141,7 @@ add_dependencies(sfizz_benchmarks bm_subtract bm_multiplyAdd bm_resample + bm_envelopes ) file(COPY "ride.wav" DESTINATION ${CMAKE_BINARY_DIR}/benchmarks) diff --git a/src/sfizz/EventEnvelopes.h b/src/sfizz/EventEnvelopes.h index 1797adb4..883c887e 100644 --- a/src/sfizz/EventEnvelopes.h +++ b/src/sfizz/EventEnvelopes.h @@ -132,7 +132,7 @@ public: }; /** - * @brief Describes a simple linear envelope. + * @brief Describes a simple multiplicative envelope. * * @tparam Type */