Skip to content
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
target
/Cargo.lock
Cargo.lock
/fuzz/hfuzz_target
4 changes: 0 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,12 @@ readme = "README.md"
documentation = "https://docs.rs/smallvec/"

[features]
const_generics = []
const_new = ["const_generics"]
write = []
union = []
specialization = []
may_dangle = []

[dependencies]
serde = { version = "1", optional = true, default-features = false }
arbitrary = { version = "1", optional = true }

[dev_dependencies]
bincode = "1.0.1"
Expand Down
37 changes: 29 additions & 8 deletions benches/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,20 @@ extern crate smallvec;
extern crate test;

use self::test::Bencher;
use smallvec::{ExtendFromSlice, SmallVec};
use smallvec::SmallVec;

const VEC_SIZE: usize = 16;
const SPILLED_SIZE: usize = 100;

trait Vector<T>: for<'a> From<&'a [T]> + Extend<T> + ExtendFromSlice<T> {
trait Vector<T>: for<'a> From<&'a [T]> + Extend<T> {
fn new() -> Self;
fn push(&mut self, val: T);
fn pop(&mut self) -> Option<T>;
fn remove(&mut self, p: usize) -> T;
fn insert(&mut self, n: usize, val: T);
fn from_elem(val: T, n: usize) -> Self;
fn from_elems(val: &[T]) -> Self;
fn extend_from_slice(&mut self, other: &[T]);
}

impl<T: Copy> Vector<T> for Vec<T> {
Expand Down Expand Up @@ -49,9 +50,13 @@ impl<T: Copy> Vector<T> for Vec<T> {
fn from_elems(val: &[T]) -> Self {
val.to_owned()
}

fn extend_from_slice(&mut self, other: &[T]) {
Vec::extend_from_slice(self, other)
}
}

impl<T: Copy> Vector<T> for SmallVec<[T; VEC_SIZE]> {
impl<T: Copy> Vector<T> for SmallVec<T, VEC_SIZE> {
fn new() -> Self {
Self::new()
}
Expand Down Expand Up @@ -79,6 +84,10 @@ impl<T: Copy> Vector<T> for SmallVec<[T; VEC_SIZE]> {
fn from_elems(val: &[T]) -> Self {
SmallVec::from_slice(val)
}

fn extend_from_slice(&mut self, other: &[T]) {
SmallVec::extend_from_slice(self, other)
}
}

macro_rules! make_benches {
Expand All @@ -93,7 +102,7 @@ macro_rules! make_benches {
}

make_benches! {
SmallVec<[u64; VEC_SIZE]> {
SmallVec<u64, VEC_SIZE> {
bench_push => gen_push(SPILLED_SIZE as _),
bench_push_small => gen_push(VEC_SIZE as _),
bench_insert_push => gen_insert_push(SPILLED_SIZE as _),
Expand All @@ -104,6 +113,8 @@ make_benches! {
bench_remove_small => gen_remove(VEC_SIZE as _),
bench_extend => gen_extend(SPILLED_SIZE as _),
bench_extend_small => gen_extend(VEC_SIZE as _),
bench_extend_filtered => gen_extend_filtered(SPILLED_SIZE as _),
bench_extend_filtered_small => gen_extend_filtered(VEC_SIZE as _),
bench_from_iter => gen_from_iter(SPILLED_SIZE as _),
bench_from_iter_small => gen_from_iter(VEC_SIZE as _),
bench_from_slice => gen_from_slice(SPILLED_SIZE as _),
Expand All @@ -128,6 +139,8 @@ make_benches! {
bench_remove_vec_small => gen_remove(VEC_SIZE as _),
bench_extend_vec => gen_extend(SPILLED_SIZE as _),
bench_extend_vec_small => gen_extend(VEC_SIZE as _),
bench_extend_vec_filtered => gen_extend_filtered(SPILLED_SIZE as _),
bench_extend_vec_filtered_small => gen_extend_filtered(VEC_SIZE as _),
bench_from_iter_vec => gen_from_iter(SPILLED_SIZE as _),
bench_from_iter_vec_small => gen_from_iter(VEC_SIZE as _),
bench_from_slice_vec => gen_from_slice(SPILLED_SIZE as _),
Expand Down Expand Up @@ -211,6 +224,14 @@ fn gen_extend<V: Vector<u64>>(n: u64, b: &mut Bencher) {
});
}

fn gen_extend_filtered<V: Vector<u64>>(n: u64, b: &mut Bencher) {
b.iter(|| {
let mut vec = V::new();
vec.extend((0..n).filter(|i| i % 2 == 0));
vec
});
}

fn gen_from_iter<V: Vector<u64>>(n: u64, b: &mut Bencher) {
let v: Vec<u64> = (0..n).collect();
b.iter(|| {
Expand Down Expand Up @@ -263,15 +284,15 @@ fn gen_from_elem<V: Vector<u64>>(n: usize, b: &mut Bencher) {
fn bench_insert_many(b: &mut Bencher) {
#[inline(never)]
fn insert_many_noinline<I: IntoIterator<Item = u64>>(
vec: &mut SmallVec<[u64; VEC_SIZE]>,
vec: &mut SmallVec<u64, VEC_SIZE>,
index: usize,
iterable: I,
) {
vec.insert_many(index, iterable)
}

b.iter(|| {
let mut vec = SmallVec::<[u64; VEC_SIZE]>::new();
let mut vec = SmallVec::<u64, VEC_SIZE>::new();
insert_many_noinline(&mut vec, 0, 0..SPILLED_SIZE as _);
insert_many_noinline(&mut vec, 0, 0..SPILLED_SIZE as _);
vec
Expand All @@ -282,7 +303,7 @@ fn bench_insert_many(b: &mut Bencher) {
fn bench_insert_from_slice(b: &mut Bencher) {
let v: Vec<u64> = (0..SPILLED_SIZE as _).collect();
b.iter(|| {
let mut vec = SmallVec::<[u64; VEC_SIZE]>::new();
let mut vec = SmallVec::<u64, VEC_SIZE>::new();
vec.insert_from_slice(0, &v);
vec.insert_from_slice(0, &v);
vec
Expand All @@ -292,7 +313,7 @@ fn bench_insert_from_slice(b: &mut Bencher) {
#[bench]
fn bench_macro_from_list(b: &mut Bencher) {
b.iter(|| {
let vec: SmallVec<[u64; 16]> = smallvec![
let vec: SmallVec<u64, 16> = smallvec![
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 20, 24, 32, 36, 0x40, 0x80,
0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000, 0x40000,
0x80000, 0x100000,
Expand Down
192 changes: 0 additions & 192 deletions fuzz/Cargo.lock

This file was deleted.

14 changes: 7 additions & 7 deletions fuzz/fuzz_targets/smallvec_ops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ fn black_box_mut_slice(s: &mut [u8]) {
black_box_iter((s as &[u8]).iter().copied())
}

fn do_test<A: smallvec::Array<Item = u8>>(data: &[u8]) -> SmallVec<A> {
let mut v = SmallVec::<A>::new();
fn do_test<const N: usize>(data: &[u8]) -> SmallVec<u8, N> {
let mut v = SmallVec::<u8, N>::new();

let mut bytes = data.iter().copied();

Expand Down Expand Up @@ -170,11 +170,11 @@ fn do_test<A: smallvec::Array<Item = u8>>(data: &[u8]) -> SmallVec<A> {
}

fn do_test_all(data: &[u8]) {
do_test::<[u8; 0]>(data);
do_test::<[u8; 1]>(data);
do_test::<[u8; 2]>(data);
do_test::<[u8; 7]>(data);
do_test::<[u8; 8]>(data);
do_test::<0>(data);
do_test::<1>(data);
do_test::<2>(data);
do_test::<7>(data);
do_test::<8>(data);
}

#[cfg(feature = "afl")]
Expand Down
19 changes: 0 additions & 19 deletions src/arbitrary.rs

This file was deleted.

Loading