#![feature(test)] extern crate afsort; extern crate rand; extern crate regex; extern crate test; use afsort::AFSortable; use rand::Rng; use regex::Regex; use std::fs::File; use std::io::{BufRead, BufReader}; use std::path::PathBuf; use test::Bencher; #[bench] fn sort_en_strings_rand_10_000_std(b: &mut Bencher) { let strings = strings_en(&Regex::new(r".*").unwrap(), 10_000); b.iter(|| strings.clone().sort_unstable()) } #[bench] fn sort_en_strings_rand_10_000_af(b: &mut Bencher) { let strings = strings_en(&Regex::new(r".*").unwrap(), 10_000); b.iter(|| strings.clone().af_sort_unstable()) } #[bench] fn sort_en_strings_rand_100_000_std(b: &mut Bencher) { let strings = strings_en(&Regex::new(r".*").unwrap(), 100_000); b.iter(|| strings.clone().sort_unstable()) } #[bench] fn sort_en_strings_rand_100_000_af(b: &mut Bencher) { let strings = strings_en(&Regex::new(r".*").unwrap(), 100_000); b.iter(|| strings.clone().af_sort_unstable()) } #[bench] fn sort_en_strings_sorted_10_000_std(b: &mut Bencher) { let mut strings = strings_en(&Regex::new(r".*").unwrap(), 10_000); strings.sort_unstable(); b.iter(|| strings.clone().sort_unstable()) } #[bench] fn sort_en_strings_sorted_10_000_af(b: &mut Bencher) { let mut strings = strings_en(&Regex::new(r".*").unwrap(), 10_000); strings.sort_unstable(); b.iter(|| strings.clone().af_sort_unstable()) } #[bench] fn sort_en_strings_lower_10_000_std(b: &mut Bencher) { let strings = strings_en(&Regex::new(r"^[a-z]+$").unwrap(), 10000); b.iter(|| strings.clone().sort_unstable()) } #[bench] fn sort_en_strings_lower_10_000_af(b: &mut Bencher) { let strings = strings_en(&Regex::new(r"^[a-z]+$").unwrap(), 10000); b.iter(|| strings.clone().af_sort_unstable()) } #[bench] fn sort_u8_1_000_std(b: &mut Bencher) { let nums = rand_u8(1_000); b.iter(|| nums.clone().sort_unstable()) } #[bench] fn sort_u8_1_000_af(b: &mut Bencher) { let nums = rand_u8(1_000); b.iter(|| nums.clone().af_sort_unstable()) } #[bench] fn sort_u16_1_000_000_std(b: &mut Bencher) { let nums = rand_u16(1_000_000); b.iter(|| nums.clone().sort_unstable()) } #[bench] fn sort_u16_1_000_000_af(b: &mut Bencher) { let nums = rand_u16(1_000_000); b.iter(|| nums.clone().af_sort_unstable()) } #[bench] fn sort_u32_1_000_000_std(b: &mut Bencher) { let nums = rand_u32(1_000_000); b.iter(|| nums.clone().sort_unstable()) } #[bench] fn sort_u32_1_000_000_af(b: &mut Bencher) { let nums = rand_u32(1_000_000); b.iter(|| nums.clone().af_sort_unstable()) } #[bench] fn sort_u64_1_000_000_std(b: &mut Bencher) { let nums = rand_u64(1_000_000); b.iter(|| nums.clone().sort_unstable()) } #[bench] fn sort_u64_1_000_000_af(b: &mut Bencher) { let nums = rand_u64(1_000_000); b.iter(|| nums.clone().af_sort_unstable()) } fn rand_u8(n: usize) -> Vec { let mut rng = rand::thread_rng(); let mut v = Vec::with_capacity(n); for _ in 0..n { v.push(rng.next_u32() as u8) } v } fn rand_u16(n: usize) -> Vec { let mut rng = rand::thread_rng(); let mut v = Vec::with_capacity(n); for _ in 0..n { v.push(rng.next_u32() as u16) } v } fn rand_u32(n: usize) -> Vec { let mut rng = rand::thread_rng(); let mut v = Vec::with_capacity(n); for _ in 0..n { v.push(rng.next_u32()) } v } fn rand_u64(n: usize) -> Vec { let mut rng = rand::thread_rng(); let mut v = Vec::with_capacity(n); for _ in 0..n { v.push(rng.next_u64()) } v } fn strings_en(re: &Regex, n: usize) -> Vec { let d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); let f = File::open(d.join("test_resources/american-english.txt")).unwrap(); let b = BufReader::new(f); let mut strings = b .lines() .map(|l| l.unwrap()) .filter(|l| re.is_match(l)) .collect::>(); let mut rng = rand::thread_rng(); rng.shuffle(&mut strings); strings.into_iter().take(n).collect::>() }