#![feature(test)] extern crate sortedvec; extern crate test; macro_rules! gen_bench { ( $gen:expr, $( $i:ident; $x:expr ),* ) => { $( mod $i { use std::borrow::Borrow; #[bench] fn find_vec(b: &mut test::Bencher) { let vec: Vec<_> = (0u32..$x).map($gen).collect(); let piv = ($gen)(($x / 2).saturating_sub(1)); b.iter(|| vec.iter().find(|&x| *x == piv)); } #[bench] fn find_hashmap(b: &mut test::Bencher) { let map: std::collections::HashMap<_, ()> = (0u32..$x).map($gen).zip(std::iter::repeat(())).collect(); let piv = ($gen)(($x / 2).saturating_sub(1)); b.iter(|| map.get(&piv)); } #[bench] fn find_sortedvec(b: &mut test::Bencher) { let vec: Vec<_> = (0u32..$x).map($gen).collect(); let sortedvec = super::SortedVec::from(vec); let piv = ($gen)(($x / 2).saturating_sub(1)); b.iter(|| sortedvec.find(&piv.borrow())); } } )* } } #[cfg(test)] mod string_bench { sortedvec::sortedvec! { struct SortedVec { fn derive_key(x: &String) -> &str { &x[..] } } } gen_bench!( |x: u32| format!("{:04}", x), s0002;2u32, s0004;4u32, s0006;6u32, s0010;10u32, s0015;15u32, s0020;20u32, s0035;35u32, s0050;50u32, s0100;100u32, s0150;150u32, s0200;200u32, s0350;350u32, s0500;500u32, s1000;1000u32 ); } #[cfg(test)] mod int_bench { sortedvec::sortedvec! { struct SortedVec { fn derive_key(x: &u32) -> u32 { *x } } } gen_bench!( |x: u32| x, s0002;2u32, s0004;4u32, s0006;6u32, s0010;10u32, s0015;15u32, s0020;20u32, s0035;35u32, s0050;50u32, s0100;100u32, s0150;150u32, s0200;200u32, s0350;350u32, s0500;500u32, s1000;1000u32 ); }