From 077518019fed807e8f471dcb943cecb9fa782073 Mon Sep 17 00:00:00 2001 From: Tarasov Aleksandr <55220741+arabianq@users.noreply.github.com> Date: Sun, 8 Mar 2026 00:28:45 +0300 Subject: [PATCH] perf: cache and sort microphone inputs once instead of every frame (#27) In `draw_footer`, the `all_inputs` HashMap was being collected into a Vec and sorted on every single UI frame (~60 FPS). This caused unnecessary overhead and allocations. This commit introduces a cached `all_inputs_sorted` vector in the `AudioPlayerState` which is populated only when the inputs map changes during the state sync. `draw_footer` now loops over this pre-sorted vector directly. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- src/gui/draw.rs | 6 ++---- src/types/gui.rs | 1 + src/utils/gui.rs | 13 ++++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/gui/draw.rs b/src/gui/draw.rs index b70853b..644ef4f 100644 --- a/src/gui/draw.rs +++ b/src/gui/draw.rs @@ -498,9 +498,7 @@ impl SoundpadGui { ui.add_space(5.0); ui.horizontal(|ui| { // ---------- Microphone selection ---------- - let mut mics: Vec<(&String, &String)> = - self.audio_player_state.all_inputs.iter().collect(); - mics.sort_by_key(|(k, _)| *k); + let mics = &self.audio_player_state.all_inputs_sorted; let mut selected_input = self.audio_player_state.current_input.to_owned(); let prev_input = selected_input.to_owned(); @@ -514,7 +512,7 @@ impl SoundpadGui { ) .show_ui(ui, |ui| { for (name, nick) in mics { - ui.selectable_value(&mut selected_input, name.to_owned(), nick); + ui.selectable_value(&mut selected_input, name.clone(), nick); } }); diff --git a/src/types/gui.rs b/src/types/gui.rs index 8e4cb1d..64b4c2f 100644 --- a/src/types/gui.rs +++ b/src/types/gui.rs @@ -55,6 +55,7 @@ pub struct AudioPlayerState { pub current_input: String, pub all_inputs: HashMap, + pub all_inputs_sorted: Vec<(String, String)>, pub is_daemon_running: bool, } diff --git a/src/utils/gui.rs b/src/utils/gui.rs index 9687666..271c538 100644 --- a/src/utils/gui.rs +++ b/src/utils/gui.rs @@ -90,7 +90,18 @@ pub fn start_app_state_thread(audio_player_state_shared: Arc = guard + .all_inputs + .iter() + .map(|(k, v)| (k.clone(), v.clone())) + .collect(); + sorted.sort_by(|a, b| a.0.cmp(&b.0)); + guard.all_inputs_sorted = sorted; + } + guard.is_daemon_running = true; }