#[macro_use] extern crate criterion; extern crate rand; extern crate bytecount; use std::env; use std::time::Duration; use rand::RngCore; use criterion::{Bencher, Criterion, ParameterizedBenchmark}; use bytecount::{ count, naive_count, naive_count_32, num_chars, naive_num_chars, }; fn random_bytes(len: usize) -> Vec { let mut result = vec![0; len]; rand::thread_rng().fill_bytes(&mut result); result } static COUNTS : &[usize] = &[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 120, 140, 170, 210, 250, 300, 400, 500, 600, 700, 800, 900, 1000, 1_000, 1_200, 1_400, 1_700, 2_100, 2_500, 3_000, 4_000, 5_000, 6_000, 7_000, 8_000, 9_000, 10_000, 12_000, 14_000, 17_000, 21_000, 25_000, 30_000, 100_000, 1_000_000]; fn get_counts() -> Vec { env::var("COUNTS").map( |s| s.split(',').map( |n| str::parse::(n).unwrap()).collect()) .unwrap_or(COUNTS.to_owned()) } fn get_config() -> Criterion { if env::var("CI").is_ok() { Criterion::default().nresamples(5_000) .without_plots() .measurement_time(Duration::new(2, 0)) .warm_up_time(Duration::new(1, 0)) } else { Criterion::default() } } fn bench_counts(criterion: &mut Criterion) { fn naive(b: &mut Bencher, s: &usize) { let haystack = random_bytes(*s); b.iter(|| naive_count(&haystack, 10)) } fn naive_32(b: &mut Bencher, s: &usize) { let haystack = random_bytes(*s); b.iter(|| naive_count_32(&haystack, 10)) } fn hyper(b: &mut Bencher, s: &usize) { let haystack = random_bytes(*s); b.iter(|| count(&haystack, 10)) } let counts = get_counts(); criterion.bench("counts", ParameterizedBenchmark::new("naive", naive, counts) .with_function("naive_32", naive_32) .with_function("hyper", hyper)); } fn bench_num_chars(criterion: &mut Criterion) { fn naive(b: &mut Bencher, s: &usize) { let haystack = random_bytes(*s); b.iter(|| naive_num_chars(&haystack)) } fn hyper(b: &mut Bencher, s: &usize) { let haystack = random_bytes(*s); b.iter(|| num_chars(&haystack)) } let counts = get_counts(); criterion.bench("num_chars", ParameterizedBenchmark::new("naive", naive, counts) .with_function("hyper", hyper)); } criterion_group!(name = count_bench; config = get_config(); targets = bench_counts); criterion_group!(name = num_chars_bench; config = get_config(); targets = bench_num_chars); criterion_main!(count_bench, num_chars_bench);