From 21b263ee3eb5a7511fde9d1bc2ca3d7578eba63b Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Sat, 28 Aug 2021 14:59:56 -0700 Subject: [PATCH] Shave off 2% by optimizing check_partial_products (#205) * Shave off 2% by optimizing check_partial_products Removes a bunch of allocations/deallocations * Minor style (Daniel PR comment) --- src/util/partial_products.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/util/partial_products.rs b/src/util/partial_products.rs index dc263bdb..432fb5c2 100644 --- a/src/util/partial_products.rs +++ b/src/util/partial_products.rs @@ -43,19 +43,18 @@ pub fn num_partial_products(n: usize, max_degree: usize) -> (usize, usize) { /// products of size `max_degree` or less. pub fn check_partial_products>( v: &[T], - partials: &[T], + mut partials: &[T], max_degree: usize, ) -> Vec { let mut res = Vec::new(); - let mut remainder = v.to_vec(); - let mut partials = partials.to_vec(); + let mut remainder = v; while remainder.len() > max_degree { let products = remainder .chunks(max_degree) - .map(|chunk| chunk.iter().copied().product()) - .collect::>(); - res.extend(products.iter().zip(&partials).map(|(&a, &b)| a - b)); - remainder = partials.drain(..products.len()).collect(); + .map(|chunk| chunk.iter().copied().product::()); + let products_len = products.len(); + res.extend(products.zip(partials).map(|(a, &b)| a - b)); + (remainder, partials) = partials.split_at(products_len); } res