minor speedup through reused allocation

This commit is contained in:
Eric Mertens 2022-11-17 08:38:14 -08:00
parent 1351653c8e
commit 08fa71a591

View File

@ -11,17 +11,15 @@ using namespace aocpp;
namespace { namespace {
auto FFT(std::size_t const start, std::vector<std::int8_t> const& prev) auto FFT(std::size_t const start, std::vector<std::int32_t> & partial_sums, std::vector<std::int8_t> & signal)
{ {
std::vector<std::int8_t> result; auto n = signal.size();
std::vector<std::int32_t> partial_sums;
auto n = prev.size(); partial_sums.clear();
result.reserve(n);
partial_sums.reserve(n+1); partial_sums.reserve(n+1);
partial_sums.push_back(0); partial_sums.push_back(0);
std::int32_t acc = 0; std::int32_t acc = 0;
for (auto const x : prev) { for (auto const x : signal) {
partial_sums.push_back(acc += x); partial_sums.push_back(acc += x);
} }
@ -29,12 +27,11 @@ auto FFT(std::size_t const start, std::vector<std::int8_t> const& prev)
std::int32_t acc = 0; std::int32_t acc = 0;
auto step = i+start+1; auto step = i+start+1;
for (std::size_t offset = i; offset < n; offset += 4*step) { for (std::size_t offset = i; offset < n; offset += 4*step) {
acc += partial_sums[std::min(n, offset + 1*step)] - partial_sums[std::min(n, offset )]; acc += partial_sums[std::min(n, offset + 1*step)] - partial_sums[std::min(n, offset + 0*step)]
acc -= partial_sums[std::min(n, offset + 3*step)] - partial_sums[std::min(n, offset + 2*step)]; + partial_sums[std::min(n, offset + 2*step)] - partial_sums[std::min(n, offset + 3*step)];
} }
result.push_back(std::abs(acc % 10)); signal[i] = std::abs(acc % 10);
} }
return result;
} }
auto Parse(std::istream & in) -> std::vector<std::int8_t> auto Parse(std::istream & in) -> std::vector<std::int8_t>
@ -55,8 +52,9 @@ auto Compute(
std::size_t offset = 0 std::size_t offset = 0
) -> std::string ) -> std::string
{ {
std::vector<std::int32_t> partial_sums;
for (std::size_t i = 0; i < iterations; i++) { for (std::size_t i = 0; i < iterations; i++) {
signal = FFT(offset, signal); FFT(offset, partial_sums, signal);
} }
signal.resize(8); signal.resize(8);
std::string result; std::string result;