81 lines
2.0 KiB
Rust
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);
|