diff --git a/Cargo.toml b/Cargo.toml index 3496e76..b95170b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,10 @@ harness = false name = "clone" harness = false +[[bench]] +name = "sum" +harness = false + [features] default = ["std"] std = [] diff --git a/benches/sum.rs b/benches/sum.rs new file mode 100644 index 0000000..8eaa570 --- /dev/null +++ b/benches/sum.rs @@ -0,0 +1,44 @@ + +extern crate arrayvec; +#[macro_use] extern crate bencher; + +use arrayvec::ArrayVec; + +use bencher::Bencher; +use bencher::black_box; + +fn sum_x(b: &mut Bencher) { + let mut v = ArrayVec::::new(); + v.extend((0..N).map(|x| x as u8)); + b.iter(|| { + let mut overall_sum: u8 = 0; + for _ in 0..100 { + let v = black_box(&v); + let mut sum: u8 = 0; + for i in 0..v.len() { + sum = sum.wrapping_add(v[i]); + } + overall_sum = overall_sum.wrapping_add(black_box(sum)); + } + black_box(overall_sum) + }); + b.bytes = v.len() as u64; +} + +fn sum_1(b: &mut Bencher) { + sum_x::<1>(b); +} +fn sum_16(b: &mut Bencher) { + sum_x::<16>(b); +} +fn sum_128(b: &mut Bencher) { + sum_x::<128>(b); +} + +benchmark_group!(benches, + sum_1, + sum_16, + sum_128, +); + +benchmark_main!(benches); diff --git a/src/array_string.rs b/src/array_string.rs index 227e01d..50c8ad9 100644 --- a/src/array_string.rs +++ b/src/array_string.rs @@ -85,7 +85,14 @@ impl ArrayString /// Return the length of the string. #[inline] - pub const fn len(&self) -> usize { self.len as usize } + pub const fn len(&self) -> usize { + let len = self.len as usize; + if len <= CAP { + len + } else { + unsafe { std::hint::unreachable_unchecked() } + } + } /// Returns whether the string is empty. #[inline] diff --git a/src/arrayvec.rs b/src/arrayvec.rs index f646b08..fda481c 100644 --- a/src/arrayvec.rs +++ b/src/arrayvec.rs @@ -111,7 +111,14 @@ impl ArrayVec { /// assert_eq!(array.len(), 2); /// ``` #[inline(always)] - pub const fn len(&self) -> usize { self.len as usize } + pub const fn len(&self) -> usize { + let len = self.len as usize; + if len <= CAP { + len + } else { + unsafe { std::hint::unreachable_unchecked() } + } + } /// Returns whether the `ArrayVec` is empty. ///