From 53e9230aa7f4c23c177ae2c00e76364f8bc197aa Mon Sep 17 00:00:00 2001 From: Avril Date: Sun, 13 Sep 2020 09:05:35 +0100 Subject: [PATCH] benchmarking --- Cargo.toml | 6 ++++++ src/ext.rs | 42 ++++++++++++++++++++++++++++++------------ src/main.rs | 2 +- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d9c1bd9..8dea5b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,12 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["experimental_inserter"] + +# Use non-allocating array inserter +experimental_inserter = [] + [dependencies] tokio = {version = "0.2", features=["full"]} async-trait = "0.1.40" diff --git a/src/ext.rs b/src/ext.rs index a529aa6..011c652 100644 --- a/src/ext.rs +++ b/src/ext.rs @@ -3,18 +3,26 @@ use super::*; pub trait VecExt { - /// Insert many elements - fn move_insert>(&mut self, location: usize, slice: I) + /// Insert many elements with exact size iterator + fn insert_exact>(&mut self, location: usize, slice: I) where Ex: ExactSizeIterator + std::panic::UnwindSafe; /// Insert many elements - fn splice_insert>(&mut self, location: usize, slice: I); + fn insert_many>(&mut self, location: usize, slice: I); } impl VecExt for Vec { - fn move_insert>(&mut self, location: usize, slice: I) + #[cfg(not(feature="experimental_inserter"))] + #[inline(always)] + fn insert_exact>(&mut self, location: usize, slice: I) + where Ex: ExactSizeIterator + std::panic::UnwindSafe + { + self.insert_many(location, slice) + } + #[cfg(feature="experimental_inserter")] + fn insert_exact>(&mut self, location: usize, slice: I) where Ex: ExactSizeIterator + std::panic::UnwindSafe, { #[inline(never)] @@ -79,7 +87,7 @@ impl VecExt for Vec self.set_len(len + sent); } } - fn splice_insert>(&mut self, location: usize, slice: I) + fn insert_many>(&mut self, location: usize, slice: I) { let slice = slice.into_iter(); match slice.size_hint() { @@ -98,17 +106,17 @@ mod tests { use super::*; #[test] - fn vec_move_insert() + fn vec_insert_exact() { let mut vec = vec![0,1,2,8,9,10]; - vec.move_insert(3, [3,4,5,6, 7].iter().copied()); + vec.insert_exact(3, [3,4,5,6, 7].iter().copied()); assert_eq!(&vec[..], &[0,1,2,3,4,5,6,7,8,9,10] ); } #[test] - fn vec_move_insert_nt() + fn vec_insert_exact_nt() { macro_rules! string { ($str:literal) => (String::from($str)); @@ -128,7 +136,7 @@ mod tests string!("uhh"), ]; - vec.move_insert(2, vec![string!("hi"), string!("hello")]); + vec.insert_exact(2, vec![string!("hi"), string!("hello")]); assert_eq!(&vec[..], &vec2[..]); } @@ -140,6 +148,16 @@ mod tests use test::{ Bencher, black_box, }; + #[cfg(not(feature="experimental_inserter"))] + #[bench] + fn move_exact(b: &mut Bencher) + { + let mut vec = vec![0,10,11,12]; + let span = [0,1,2,3]; + b.iter(|| { + black_box(vec.insert_exact(2, span.iter().copied())); + }); + } #[bench] fn move_via_splice(b: &mut Bencher) { @@ -147,18 +165,18 @@ mod tests let span = [0,1,2,3]; b.iter(|| { - black_box(vec.splice_insert(2, span.iter().copied())); + black_box(vec.insert_many(2, span.iter().copied())); }); } + #[cfg(feature="experimental_inserter")] #[bench] fn move_via_unsafe(b: &mut Bencher) { let mut vec = vec![0,10,11,12]; let span = [0,1,2,3]; b.iter(|| { - black_box(vec.move_insert(2, span.iter().copied())); + black_box(vec.insert_exact(2, span.iter().copied())); }); } } - } diff --git a/src/main.rs b/src/main.rs index 1899ea7..e2787ac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,5 +26,5 @@ mod post; mod state; fn main() { - println!("Hello, world!"); + }