Files

81 lines
2.0 KiB
Rust

use bencher::Bencher;
use crc32fast::Hasher;
use rand::Rng;
fn bench(b: &mut Bencher, size: usize, hasher_init: Hasher) {
let mut bytes = vec![0u8; size];
rand::thread_rng().fill(&mut bytes[..]);
b.iter(|| {
let mut hasher = hasher_init.clone();
hasher.update(&bytes);
bencher::black_box(hasher.finalize())
});
b.bytes = size as u64;
}
fn bench_kilobyte_baseline(b: &mut Bencher) {
bench(b, 1024, Hasher::internal_new_baseline(0, 0))
}
fn bench_kilobyte_specialized(b: &mut Bencher) {
bench(b, 1024, Hasher::internal_new_specialized(0, 0).unwrap())
}
fn bench_megabyte_baseline(b: &mut Bencher) {
bench(b, 1024 * 1024, Hasher::internal_new_baseline(0, 0))
}
fn bench_megabyte_specialized(b: &mut Bencher) {
bench(
b,
1024 * 1024,
Hasher::internal_new_specialized(0, 0).unwrap(),
)
}
fn bench_combine_inner(b: &mut Bencher, i1: u32, l1: u64, i2: u32, l2: u64) {
let h1 = Hasher::new_with_initial_len(i1, l1);
let h2 = Hasher::new_with_initial_len(i2, l2);
b.iter(|| {
let mut h = h1.clone();
h.combine(&h2);
bencher::black_box(h);
})
}
fn bench_combine_16(b: &mut Bencher) {
let (i1, l1, i2, l2): (u32, u64, u32, u16) = rand::thread_rng().gen();
bench_combine_inner(b, i1, l1, i2, u64::from(l2))
}
fn bench_combine_32(b: &mut Bencher) {
let (i1, l1, i2, l2): (u32, u64, u32, u32) = rand::thread_rng().gen();
bench_combine_inner(b, i1, l1, i2, u64::from(l2))
}
fn bench_combine_64(b: &mut Bencher) {
let (i1, l1, i2, l2): (u32, u64, u32, u64) = rand::thread_rng().gen();
bench_combine_inner(b, i1, l1, i2, l2)
}
bencher::benchmark_group!(
bench_baseline,
bench_kilobyte_baseline,
bench_megabyte_baseline
);
bencher::benchmark_group!(
bench_specialized,
bench_kilobyte_specialized,
bench_megabyte_specialized
);
bencher::benchmark_group!(
bench_combine,
bench_combine_16,
bench_combine_32,
bench_combine_64
);
bencher::benchmark_main!(bench_baseline, bench_specialized, bench_combine);