From 0e963993b728779c32c4417e0bc6b256a6107d09 Mon Sep 17 00:00:00 2001 From: Nipunn Koorapati Date: Sun, 11 Sep 2016 22:31:49 -0700 Subject: [PATCH 1/2] Move benchmarks to benches module This ensures that the benchmarks are in a separate crate and linked against the smallvec dynamic library rather than being compiled together. --- .travis.yml | 3 +-- Cargo.toml | 3 --- benches/bench.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++ lib.rs | 52 ------------------------------------------------ 4 files changed, 51 insertions(+), 57 deletions(-) create mode 100644 benches/bench.rs diff --git a/.travis.yml b/.travis.yml index 87270d5..0884694 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,6 @@ rust: script: | cargo build --verbose && cargo test --verbose && - ([ $TRAVIS_RUST_VERSION != nightly ] || cargo test --verbose --features benchmarks) && - ([ $TRAVIS_RUST_VERSION != nightly ] || cargo bench --verbose --features benchmarks bench) + ([ $TRAVIS_RUST_VERSION != nightly ] || cargo bench --verbose bench) notifications: webhooks: http://build.servo.org:54856/travis diff --git a/Cargo.toml b/Cargo.toml index bf4880b..df4aa31 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,3 @@ documentation = "http://doc.servo.org/smallvec/" name = "smallvec" path = "lib.rs" doctest = false - -[features] -benchmarks = [] diff --git a/benches/bench.rs b/benches/bench.rs new file mode 100644 index 0000000..1de96db --- /dev/null +++ b/benches/bench.rs @@ -0,0 +1,50 @@ +#![feature(test)] + +extern crate smallvec; +extern crate test; + +use smallvec::SmallVec; +use self::test::Bencher; + +#[bench] +fn bench_push(b: &mut Bencher) { + b.iter(|| { + let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); + for x in 0..100 { + vec.push(x); + } + vec + }); +} + +#[bench] +fn bench_insert(b: &mut Bencher) { + b.iter(|| { + let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); + for x in 0..100 { + vec.insert(0, x); + } + vec + }); +} + +#[bench] +fn bench_extend(b: &mut Bencher) { + b.iter(|| { + let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); + vec.extend(0..100); + vec + }); +} + +#[bench] +fn bench_pushpop(b: &mut Bencher) { + b.iter(|| { + let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); + for x in 0..100 { + vec.push(x); + vec.pop(); + } + vec + }); +} diff --git a/lib.rs b/lib.rs index 8f64a1e..09ecbba 100644 --- a/lib.rs +++ b/lib.rs @@ -5,8 +5,6 @@ //! Small vectors in various sizes. These store a certain number of elements inline and fall back //! to the heap for larger allocations. -#![cfg_attr(feature = "benchmarks", feature(test))] - use std::borrow::{Borrow, BorrowMut}; use std::cmp; use std::fmt; @@ -1010,53 +1008,3 @@ pub mod tests { assert_eq!(vec.drain().len(), 3); } } - -#[cfg(all(feature = "benchmarks", test))] -mod bench { - extern crate test; - use SmallVec; - use self::test::Bencher; - - #[bench] - fn bench_push(b: &mut Bencher) { - b.iter(|| { - let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); - for x in 0..100 { - vec.push(x); - } - vec - }); - } - - #[bench] - fn bench_insert(b: &mut Bencher) { - b.iter(|| { - let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); - for x in 0..100 { - vec.insert(0, x); - } - vec - }); - } - - #[bench] - fn bench_extend(b: &mut Bencher) { - b.iter(|| { - let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); - vec.extend(0..100); - vec - }); - } - - #[bench] - fn bench_pushpop(b: &mut Bencher) { - b.iter(|| { - let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); - for x in 0..100 { - vec.push(x); - vec.pop(); - } - vec - }); - } -} From 59f5ea6057ba7473be5efeb3e04e4bd6346dae9d Mon Sep 17 00:00:00 2001 From: Nipunn Koorapati Date: Mon, 12 Sep 2016 00:48:00 -0700 Subject: [PATCH 2/2] Use a #noinline wrapper from the benchmarks to get consistent results --- benches/bench.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/benches/bench.rs b/benches/bench.rs index 1de96db..8acb3c9 100644 --- a/benches/bench.rs +++ b/benches/bench.rs @@ -8,10 +8,15 @@ use self::test::Bencher; #[bench] fn bench_push(b: &mut Bencher) { + #[inline(never)] + fn push_noinline(vec: &mut SmallVec<[u64; 16]>, x: u64) { + vec.push(x) + } + b.iter(|| { let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); for x in 0..100 { - vec.push(x); + push_noinline(&mut vec, x); } vec }); @@ -19,10 +24,15 @@ fn bench_push(b: &mut Bencher) { #[bench] fn bench_insert(b: &mut Bencher) { + #[inline(never)] + fn insert_noinline(vec: &mut SmallVec<[u64; 16]>, x: u64) { + vec.insert(0, x) + } + b.iter(|| { let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); for x in 0..100 { - vec.insert(0, x); + insert_noinline(&mut vec, x); } vec }); @@ -39,11 +49,16 @@ fn bench_extend(b: &mut Bencher) { #[bench] fn bench_pushpop(b: &mut Bencher) { + #[inline(never)] + fn pushpop_noinline(vec: &mut SmallVec<[u64; 16]>, x: u64) { + vec.push(x); + vec.pop(); + } + b.iter(|| { let mut vec: SmallVec<[u64; 16]> = SmallVec::new(); for x in 0..100 { - vec.push(x); - vec.pop(); + pushpop_noinline(&mut vec, x); } vec });