From 05614782d11d53b9c8022c894eb5728fa8f1f591 Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Wed, 4 May 2022 11:11:38 -0400 Subject: [PATCH] performance improvements --- benchmarks/src/lib.rs | 15 ++++++--------- parsing/src/lib.rs | 1 + parsing/src/suggestions.rs | 16 ++++++++++++---- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/benchmarks/src/lib.rs b/benchmarks/src/lib.rs index 4a40a0e..d091d3c 100644 --- a/benchmarks/src/lib.rs +++ b/benchmarks/src/lib.rs @@ -55,6 +55,7 @@ fn custom_criterion() -> Criterion { Criterion::default() // .with_profiler(FlamegraphProfiler::new(100)) .warm_up_time(Duration::from_millis(250)) + .sample_size(1000) } #[criterion(custom_criterion())] @@ -79,15 +80,11 @@ fn split_function_bench(c: &mut Criterion) { let mut group = c.benchmark_group("split_function"); for entry in data_chars { - group.bench_with_input( - BenchmarkId::new("split_function", entry.iter().collect::()), - &entry, - |b, i| { - b.iter(|| { - split_function_chars(i); - }) - }, - ); + group.bench_function(entry.iter().collect::(), |b| { + b.iter(|| { + split_function_chars(&entry); + }) + }); } group.finish(); } diff --git a/parsing/src/lib.rs b/parsing/src/lib.rs index 47a9fd0..1b73b11 100644 --- a/parsing/src/lib.rs +++ b/parsing/src/lib.rs @@ -1,4 +1,5 @@ #![feature(const_trait_impl)] +#![feature(core_intrinsics)] pub mod parsing; pub mod suggestions; diff --git a/parsing/src/suggestions.rs b/parsing/src/suggestions.rs index c542d13..1b99ae9 100644 --- a/parsing/src/suggestions.rs +++ b/parsing/src/suggestions.rs @@ -1,3 +1,5 @@ +use std::intrinsics::assume; + use crate::parsing::is_variable; pub const HINT_EMPTY: Hint = Hint::Single("x^2"); @@ -35,7 +37,7 @@ pub fn split_function_chars(chars: &[char]) -> Vec { } // Resulting split-up data - let mut data: Vec = Vec::with_capacity(chars.len()); + let mut data: Vec> = Vec::with_capacity(chars.len()); // Buffer used to store data ready to be appended let mut buffer: Vec<&char> = Vec::with_capacity(chars.len()); @@ -156,7 +158,7 @@ pub fn split_function_chars(chars: &[char]) -> Vec { // Append split if do_split { - data.push(buffer.iter().cloned().collect::()); + data.push(buffer.clone()); buffer.clear(); } @@ -169,10 +171,16 @@ pub fn split_function_chars(chars: &[char]) -> Vec { // If there is still data in the buffer, append it if !buffer.is_empty() { - data.push(buffer.iter().cloned().collect::()); + data.push(buffer); } - data + unsafe { + assume(!data.is_empty()); + } + + data.iter() + .map(|e| e.iter().cloned().collect::()) + .collect() } /// Generate a hint based on the input `input`, returns an `Option`