From ade210ea317198066ddd67b9089f95369e1d6320 Mon Sep 17 00:00:00 2001 From: dmyTRUEk <25669613+dmyTRUEk@users.noreply.github.com> Date: Fri, 29 Mar 2024 20:02:27 +0200 Subject: [PATCH] perf: optimize getting random quote building new vec of quotes for it to be selected one at random from is overhead, building new vec is required only in case of filtering, for example, by character --- src/main.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index 02d5f08..7727943 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,14 +36,20 @@ fn main() -> Result<(), &'static str> { } fn get_random_quote(char: Option) -> Result<&'static Quote, &'static str> { - let quotes: Vec<&Quote> = match char { - None => QUOTES.iter().collect(), - Some(char) => QUOTES.iter() - .filter(|quote| quote.char.to_str().to_lowercase().contains(&char.to_lowercase())) - .collect() - }; - if quotes.len() == 0 { return Err("Character or her quote not found.") } let mut rng = thread_rng(); - let random_quote_index: usize = rng.gen_range(0..quotes.len()); - Ok(quotes[random_quote_index]) + match char { + None => { + let random_quote_index: usize = rng.gen_range(0..QUOTES.len()); + Ok("ES[random_quote_index]) + } + Some(char) => { + let char_lowercase: String = char.to_lowercase(); + let quotes: Vec<&Quote> = QUOTES.iter() + .filter(|quote| quote.char.to_str().to_lowercase().contains(&char_lowercase)) + .collect(); + if quotes.len() == 0 { return Err("Character's quote not found.") } + let random_quote_index: usize = rng.gen_range(0..quotes.len()); + Ok(quotes[random_quote_index]) + } + } }