From 24672dc3ff1df54939bec08f2ef1be000dd23560 Mon Sep 17 00:00:00 2001 From: Lukas Lihotzki Date: Sat, 30 Jul 2022 18:44:32 +0200 Subject: [PATCH] Fix performance regression introduced by syncable_voice --- src/synth.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/synth.rs b/src/synth.rs index ce7724f..0b77f2e 100644 --- a/src/synth.rs +++ b/src/synth.rs @@ -24,6 +24,17 @@ pub struct Synth { pub ext_in: i32, } +// slice::rotate_left is inefficient for small arrays: +// https://github.com/rust-lang/rust/issues/89714 +fn rotate3([a, b, c]: [T; 3], i: usize) -> [T; 3] { + match i { + 0 => [a, b, c], + 1 => [b, c, a], + 2 => [c, a, b], + _ => panic!("index out of bounds"), + } +} + impl Synth { pub fn new(chip_model: ChipModel) -> Self { Synth { @@ -36,9 +47,7 @@ impl Synth { pub fn syncable_voice(&self, i: usize) -> Syncable<&'_ Voice> { let [a, b, c] = &self.voices; - let mut voices_ref = [a, b, c]; - voices_ref.rotate_left(i); - let [main, sync_dest, sync_source] = voices_ref; + let [main, sync_dest, sync_source] = rotate3([a, b, c], i); Syncable { main, sync_dest, @@ -48,9 +57,7 @@ impl Synth { pub fn syncable_voice_mut(&mut self, i: usize) -> Syncable<&'_ mut Voice> { let [a, b, c] = &mut self.voices; - let mut voices_mut = [a, b, c]; - voices_mut.rotate_left(i); - let [main, sync_dest, sync_source] = voices_mut; + let [main, sync_dest, sync_source] = rotate3([a, b, c], i); Syncable { main, sync_dest,