diff --git a/.travis.yml b/.travis.yml index fd1c19d..87270d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,5 +3,10 @@ rust: - nightly - beta - stable +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) notifications: webhooks: http://build.servo.org:54856/travis diff --git a/Cargo.toml b/Cargo.toml index df4aa31..bf4880b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,6 @@ documentation = "http://doc.servo.org/smallvec/" name = "smallvec" path = "lib.rs" doctest = false + +[features] +benchmarks = [] diff --git a/lib.rs b/lib.rs index e2587a8..c4bae36 100644 --- a/lib.rs +++ b/lib.rs @@ -5,6 +5,8 @@ //! 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; @@ -1001,3 +1003,53 @@ 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 + }); + } +}