Change iterators to pointers

MSVC STL and libc++ iterators do not decay to pointers as easily as gcc
This commit is contained in:
Paul Ferrand 2020-02-09 11:16:58 +01:00
parent 8eaa2a39de
commit f2fa0cf55a
2 changed files with 170 additions and 159 deletions

View file

@ -49,17 +49,18 @@ BENCHMARK_DEFINE_F(FilterFixture, OnePole_VA)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto inputIterator = input.begin(); auto inputPtr = input.data();
auto outputIterator = output.begin(); auto outputPtr = output.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
const auto gain = sfz::OnePoleFilter<float>::normalizedGain(*cutoffIterator, sampleRate); const auto gain = sfz::OnePoleFilter<float>::normalizedGain(*cutoffPtr, sampleRate);
filter.setGain(gain); filter.setGain(gain);
filter.processLowpass({ inputIterator.base(), step }, { outputIterator.base(), step } ); filter.processLowpass({ inputPtr, step }, { outputPtr, step } );
cutoffIterator += step; cutoffPtr += step;
inputIterator += step; inputPtr += step;
outputIterator += step; outputPtr += step;
} }
} }
} }
@ -71,15 +72,16 @@ BENCHMARK_DEFINE_F(FilterFixture, OnePole_Faust)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto inputIterator = input.begin(); auto inputPtr = input.data();
auto outputIterator = output.begin(); auto outputPtr = output.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
filter.process(&inputIterator.base(), &outputIterator.base(), *cutoffIterator, 0.0, 0.0, step); filter.process(&inputPtr, &outputPtr, *cutoffPtr, 0.0, 0.0, step);
cutoffIterator += step; cutoffPtr += step;
inputIterator += step; inputPtr += step;
outputIterator += step; outputPtr += step;
} }
} }
} }
@ -91,17 +93,18 @@ BENCHMARK_DEFINE_F(FilterFixture, TwoPole_Faust)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto qIterator = q.begin(); auto qIterator = q.begin();
auto inputIterator = input.begin(); auto inputPtr = input.data();
auto outputIterator = output.begin(); auto outputPtr = output.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
filter.process(&inputIterator.base(), &outputIterator.base(), *cutoffIterator, *qIterator, 0.0, step); filter.process(&inputPtr, &outputPtr, *cutoffPtr, *qIterator, 0.0, step);
qIterator += step; qIterator += step;
cutoffIterator += step; cutoffPtr += step;
inputIterator += step; inputPtr += step;
outputIterator += step; outputPtr += step;
} }
} }
} }
@ -113,19 +116,20 @@ BENCHMARK_DEFINE_F(FilterFixture, TwoPoleShelf_Faust)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto qIterator = q.begin(); auto qIterator = q.begin();
auto pkshIterator = pksh.begin(); auto pkshIterator = pksh.begin();
auto inputIterator = input.begin(); auto inputPtr = input.data();
auto outputIterator = output.begin(); auto outputPtr = output.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
filter.process(&inputIterator.base(), &outputIterator.base(), *cutoffIterator, *qIterator, *pkshIterator, step); filter.process(&inputPtr, &outputPtr, *cutoffPtr, *qIterator, *pkshIterator, step);
qIterator += step; qIterator += step;
cutoffIterator += step; cutoffPtr += step;
pkshIterator += step; pkshIterator += step;
inputIterator += step; inputPtr += step;
outputIterator += step; outputPtr += step;
} }
} }
} }

View file

@ -19,7 +19,7 @@ constexpr float sampleRate { 48000.0f };
class FilterFixture : public benchmark::Fixture { class FilterFixture : public benchmark::Fixture {
public: public:
void SetUp(const ::benchmark::State&) { void SetUp(const ::benchmark::State& state) {
inputLeft = std::vector<float>(blockSize); inputLeft = std::vector<float>(blockSize);
inputRight = std::vector<float>(blockSize); inputRight = std::vector<float>(blockSize);
outputLeft = std::vector<float>(blockSize); outputLeft = std::vector<float>(blockSize);
@ -56,15 +56,16 @@ BENCHMARK_DEFINE_F(FilterFixture, OnePole_MonoOnce)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto inLIterator = inputLeft.begin(); auto inLPtr = inputLeft.data();
auto outLIterator = outputRight.begin(); auto outLPtr = outputRight.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
filterLeft.process( &inLIterator.base(), &outLIterator.base(), *cutoffIterator, 0.0, 0.0, step); filterLeft.process( &inLPtr, &outLPtr, *cutoffPtr, 0.0, 0.0, step);
cutoffIterator += step; cutoffPtr += step;
inLIterator += step; inLPtr += step;
outLIterator += step; outLPtr += step;
} }
} }
} }
@ -79,20 +80,21 @@ BENCHMARK_DEFINE_F(FilterFixture, OnePole_MonoTwice)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto inLIterator = inputLeft.begin(); auto inLPtr = inputLeft.data();
auto inRIterator = inputRight.begin(); auto inRPtr = inputRight.data();
auto outRIterator = outputLeft.begin(); auto outRPtr = outputLeft.data();
auto outLIterator = outputRight.begin(); auto outLPtr = outputRight.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
filterLeft.process( &inLIterator.base(), &outLIterator.base(), *cutoffIterator, 0.0, 0.0, step); filterLeft.process( &inLPtr, &outLPtr, *cutoffPtr, 0.0, 0.0, step);
filterRight.process(&inRIterator.base(), &outRIterator.base(), *cutoffIterator, 0.0, 0.0, step); filterRight.process(&inRPtr, &outRPtr, *cutoffPtr, 0.0, 0.0, step);
cutoffIterator += step; cutoffPtr += step;
inLIterator += step; inLPtr += step;
inRIterator += step; inRPtr += step;
outLIterator += step; outLPtr += step;
outRIterator += step; outRPtr += step;
} }
} }
} }
@ -105,21 +107,22 @@ BENCHMARK_DEFINE_F(FilterFixture, OnePole_Stereo)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto inLIterator = inputLeft.begin(); auto inLPtr = inputLeft.data();
auto inRIterator = inputRight.begin(); auto inRPtr = inputRight.data();
auto outRIterator = outputLeft.begin(); auto outRPtr = outputLeft.data();
auto outLIterator = outputRight.begin(); auto outLPtr = outputRight.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
float * inputs[2] = { inLIterator.base(), inRIterator.base() }; float * inputs[2] = { inLPtr, inRPtr };
float * outputs[2] = { outLIterator.base(), outRIterator.base() }; float * outputs[2] = { outLPtr, outRPtr };
filter.process(inputs, outputs, *cutoffIterator, 0.0, 0.0, step); filter.process(inputs, outputs, *cutoffPtr, 0.0, 0.0, step);
cutoffIterator += step; cutoffPtr += step;
inLIterator += step; inLPtr += step;
inRIterator += step; inRPtr += step;
outLIterator += step; outLPtr += step;
outRIterator += step; outRPtr += step;
} }
} }
} }
@ -131,17 +134,18 @@ BENCHMARK_DEFINE_F(FilterFixture, TwoPole_MonoOnce)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto qIterator = q.begin(); auto qPtr = q.data();
auto inLIterator = inputLeft.begin(); auto inLPtr = inputLeft.data();
auto outLIterator = outputRight.begin(); auto outLPtr = outputRight.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
filterLeft.process(&inLIterator.base(), &outLIterator.base(), *cutoffIterator, *qIterator, 0.0, step); filterLeft.process(&inLPtr, &outLPtr, *cutoffPtr, *qPtr, 0.0, step);
cutoffIterator += step; cutoffPtr += step;
qIterator += step; qPtr += step;
inLIterator += step; inLPtr += step;
outLIterator += step; outLPtr += step;
} }
} }
} }
@ -156,22 +160,23 @@ BENCHMARK_DEFINE_F(FilterFixture, TwoPole_MonoTwice)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto qIterator = q.begin(); auto qPtr = q.data();
auto inLIterator = inputLeft.begin(); auto inLPtr = inputLeft.data();
auto inRIterator = inputRight.begin(); auto inRPtr = inputRight.data();
auto outRIterator = outputLeft.begin(); auto outRPtr = outputLeft.data();
auto outLIterator = outputRight.begin(); auto outLPtr = outputRight.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
filterLeft.process( &inLIterator.base(), &outLIterator.base(), *cutoffIterator, *qIterator, 0.0, step); filterLeft.process( &inLPtr, &outLPtr, *cutoffPtr, *qPtr, 0.0, step);
filterRight.process(&inRIterator.base(), &outRIterator.base(), *cutoffIterator, *qIterator, 0.0, step); filterRight.process(&inRPtr, &outRPtr, *cutoffPtr, *qPtr, 0.0, step);
cutoffIterator += step; cutoffPtr += step;
qIterator += step; qPtr += step;
inLIterator += step; inLPtr += step;
inRIterator += step; inRPtr += step;
outLIterator += step; outLPtr += step;
outRIterator += step; outRPtr += step;
} }
} }
} }
@ -184,23 +189,24 @@ BENCHMARK_DEFINE_F(FilterFixture, TwoPole_Stereo)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto qIterator = q.begin(); auto qPtr = q.data();
auto inLIterator = inputLeft.begin(); auto inLPtr = inputLeft.data();
auto inRIterator = inputRight.begin(); auto inRPtr = inputRight.data();
auto outRIterator = outputLeft.begin(); auto outRPtr = outputLeft.data();
auto outLIterator = outputRight.begin(); auto outLPtr = outputRight.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
float * inputs[2] = { inLIterator.base(), inRIterator.base() }; float * inputs[2] = { inLPtr, inRPtr };
float * outputs[2] = { outLIterator.base(), outRIterator.base() }; float * outputs[2] = { outLPtr, outRPtr };
filter.process(inputs, outputs, *cutoffIterator, *qIterator, 0.0, step); filter.process(inputs, outputs, *cutoffPtr, *qPtr, 0.0, step);
cutoffIterator += step; cutoffPtr += step;
qIterator += step; qPtr += step;
inLIterator += step; inLPtr += step;
inRIterator += step; inRPtr += step;
outLIterator += step; outLPtr += step;
outRIterator += step; outRPtr += step;
} }
} }
} }
@ -212,19 +218,20 @@ BENCHMARK_DEFINE_F(FilterFixture, Shelf_MonoOnce)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto qIterator = q.begin(); auto qPtr = q.data();
auto pkshIterator = pksh.begin(); auto pkshPtr = pksh.data();
auto inLIterator = inputLeft.begin(); auto inLPtr = inputLeft.data();
auto outLIterator = outputRight.begin(); auto outLPtr = outputRight.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
filterLeft.process(&inLIterator.base(), &outLIterator.base(), *cutoffIterator, *qIterator, *pkshIterator, step); filterLeft.process(&inLPtr, &outLPtr, *cutoffPtr, *qPtr, *pkshPtr, step);
cutoffIterator += step; cutoffPtr += step;
qIterator += step; qPtr += step;
pkshIterator += step; pkshPtr += step;
inLIterator += step; inLPtr += step;
outLIterator += step; outLPtr += step;
} }
} }
} }
@ -235,28 +242,28 @@ BENCHMARK_DEFINE_F(FilterFixture, Shelf_MonoTwice)(benchmark::State& state) {
filterLeft.init(sampleRate); filterLeft.init(sampleRate);
filterLeft.setType(sfz::FilterType::kFilterLpf2p); filterLeft.setType(sfz::FilterType::kFilterLpf2p);
filterRight.init(sampleRate); filterRight.init(sampleRate);
filterRight.setType(sfz::FilterType::kFilterLpf2p);
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto qIterator = q.begin(); auto qPtr = q.data();
auto pkshIterator = pksh.begin(); auto pkshPtr = pksh.data();
auto inLIterator = inputLeft.begin(); auto inLPtr = inputLeft.data();
auto inRIterator = inputRight.begin(); auto inRPtr = inputRight.data();
auto outRIterator = outputLeft.begin(); auto outRPtr = outputLeft.data();
auto outLIterator = outputRight.begin(); auto outLPtr = outputRight.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
filterLeft.process( &inLIterator.base(), &outLIterator.base(), *cutoffIterator, *qIterator, *pkshIterator, step); filterLeft.process( &inLPtr, &outLPtr, *cutoffPtr, *qPtr, *pkshPtr, step);
filterRight.process(&inRIterator.base(), &outRIterator.base(), *cutoffIterator, *qIterator, *pkshIterator, step); filterRight.process(&inRPtr, &outRPtr, *cutoffPtr, *qPtr, *pkshPtr, step);
cutoffIterator += step; cutoffPtr += step;
qIterator += step; qPtr += step;
pkshIterator += step; pkshPtr += step;
inLIterator += step; inLPtr += step;
inRIterator += step; inRPtr += step;
outLIterator += step; outLPtr += step;
outRIterator += step; outRPtr += step;
} }
} }
} }
@ -269,25 +276,26 @@ BENCHMARK_DEFINE_F(FilterFixture, Shelf_Stereo)(benchmark::State& state) {
for (auto _ : state) for (auto _ : state)
{ {
const auto step = static_cast<size_t>(state.range(0)); const auto step = static_cast<size_t>(state.range(0));
auto cutoffIterator = cutoff.begin(); auto cutoffPtr = cutoff.data();
auto qIterator = q.begin(); auto qPtr = q.data();
auto pkshIterator = pksh.begin(); auto pkshPtr = pksh.data();
auto inLIterator = inputLeft.begin(); auto inLPtr = inputLeft.data();
auto inRIterator = inputRight.begin(); auto inRPtr = inputRight.data();
auto outRIterator = outputLeft.begin(); auto outRPtr = outputLeft.data();
auto outLIterator = outputRight.begin(); auto outLPtr = outputRight.data();
while (cutoffIterator < cutoff.end()) const auto sentinel = cutoff.data() + blockSize;
while (cutoffPtr < sentinel)
{ {
float * inputs[2] = { inLIterator.base(), inRIterator.base() }; float * inputs[2] = { inLPtr, inRPtr };
float * outputs[2] = { outLIterator.base(), outRIterator.base() }; float * outputs[2] = { outLPtr, outRPtr };
filter.process(inputs, outputs, *cutoffIterator, *qIterator, *pkshIterator, step); filter.process(inputs, outputs, *cutoffPtr, *qPtr, *pkshPtr, step);
cutoffIterator += step; cutoffPtr += step;
qIterator += step; qPtr += step;
pkshIterator += step; pkshPtr += step;
inLIterator += step; inLPtr += step;
inRIterator += step; inRPtr += step;
outLIterator += step; outLPtr += step;
outRIterator += step; outRPtr += step;
} }
} }
} }
@ -302,4 +310,3 @@ BENCHMARK_REGISTER_F(FilterFixture, Shelf_MonoOnce)->RangeMultiplier(2)->Range(1
BENCHMARK_REGISTER_F(FilterFixture, Shelf_MonoTwice)->RangeMultiplier(2)->Range(1, 1 << 8); BENCHMARK_REGISTER_F(FilterFixture, Shelf_MonoTwice)->RangeMultiplier(2)->Range(1, 1 << 8);
BENCHMARK_REGISTER_F(FilterFixture, Shelf_Stereo)->RangeMultiplier(2)->Range(1, 1 << 8); BENCHMARK_REGISTER_F(FilterFixture, Shelf_Stereo)->RangeMultiplier(2)->Range(1, 1 << 8);
BENCHMARK_MAIN(); BENCHMARK_MAIN();