diff --git a/home-mixer/benches/muted_keywords_perf.rs b/home-mixer/benches/muted_keywords_perf.rs new file mode 100644 index 0000000..7703eb2 --- /dev/null +++ b/home-mixer/benches/muted_keywords_perf.rs @@ -0,0 +1,76 @@ +// Usage: rustc -O home-mixer/benches/muted_keywords_perf.rs && ./muted_keywords_perf + +use std::time::Instant; + +// Simulate the heavy operation of tokenizing/processing a string +fn simulate_process(s: &str) -> usize { + s.len() +} + +// The "Before" implementation: Clones the vector +fn implementation_before(keywords: &Vec) -> usize { + // OLD CODE: Cloned the vector + let muted_keywords = keywords.clone(); + + if muted_keywords.is_empty() { + return 0; + } + + let processed = muted_keywords.iter().map(|k| simulate_process(k)); + processed.sum() +} + +// The "After" implementation: Uses a reference +fn implementation_after(keywords: &Vec) -> usize { + // NEW CODE: Uses reference + let muted_keywords = keywords; + + if muted_keywords.is_empty() { + return 0; + } + + let processed = muted_keywords.iter().map(|k| simulate_process(k)); + processed.sum() +} + +fn main() { + // Setup data + let keyword_count = 100; + let iterations = 1_000_000; + let keywords: Vec = (0..keyword_count).map(|i| format!("keyword_{}", i)).collect(); + + println!("Running benchmark with {} keywords over {} iterations...", keyword_count, iterations); + + // Warmup + for _ in 0..1000 { + implementation_before(&keywords); + implementation_after(&keywords); + } + + // Measure Before + let start_before = Instant::now(); + let mut sum_before = 0; + for _ in 0..iterations { + sum_before += implementation_before(&keywords); + } + let duration_before = start_before.elapsed(); + + // Measure After + let start_after = Instant::now(); + let mut sum_after = 0; + for _ in 0..iterations { + sum_after += implementation_after(&keywords); + } + let duration_after = start_after.elapsed(); + + // Verify correctness + assert_eq!(sum_before, sum_after, "Implementations produced different results!"); + + // Report + println!("\nResults:"); + println!("Before (Clone): {:.4} seconds", duration_before.as_secs_f64()); + println!("After (Reference): {:.4} seconds", duration_after.as_secs_f64()); + + let speedup = duration_before.as_secs_f64() / duration_after.as_secs_f64(); + println!("Speedup: {:.2}x", speedup); +} diff --git a/home-mixer/filters/muted_keyword_filter.rs b/home-mixer/filters/muted_keyword_filter.rs index 7db116c..a9cd27d 100644 --- a/home-mixer/filters/muted_keyword_filter.rs +++ b/home-mixer/filters/muted_keyword_filter.rs @@ -26,7 +26,7 @@ impl Filter for MutedKeywordFilter { query: &ScoredPostsQuery, candidates: Vec, ) -> Result, String> { - let muted_keywords = query.user_features.muted_keywords.clone(); + let muted_keywords = &query.user_features.muted_keywords; if muted_keywords.is_empty() { return Ok(FilterResult {