#![feature(test)] extern crate binary_tree; extern crate rand; extern crate test; use binary_tree::count::CountTree; use rand::{Rand, Rng, StdRng, SeedableRng, thread_rng}; use std::env; use std::str::FromStr; use std::collections::LinkedList; use test::Bencher; const TOTAL: usize = 4096; fn get_seed() -> usize { match env::var("RAND_SEED") { Ok(val) => usize::from_str(&*val).unwrap(), Err(_) => { let seed = usize::rand(&mut thread_rng()); env::set_var("RAND_SEED", seed.to_string()); seed } } } #[bench] pub fn remove_at_random_ct(b: &mut Bencher) { let seed = get_seed(); let rng = StdRng::from_seed(&[seed]); b.iter(|| { let mut rng = rng.clone(); let mut ct: CountTree<_> = (0..TOTAL).collect(); for i in 0..TOTAL { ct.remove(rng.gen_range(0, TOTAL - i)); } }); } #[bench] pub fn remove_at_random_ll(b: &mut Bencher) { let seed = get_seed(); let rng = StdRng::from_seed(&[seed]); b.iter(|| { let mut rng = rng.clone(); let mut ll: LinkedList<_> = (0..TOTAL).collect(); for i in 0..TOTAL { let mut tail = ll.split_off(rng.gen_range(0, TOTAL - i)); tail.pop_front(); ll.append(&mut tail); } }); } #[bench] pub fn remove_at_random_vec(b: &mut Bencher) { let seed = get_seed(); let rng = StdRng::from_seed(&[seed]); b.iter(|| { let mut rng = rng.clone(); let mut v: Vec<_> = (0..TOTAL).collect(); for i in 0..TOTAL { v.remove(rng.gen_range(0, TOTAL - i)); } }); }