86 lines
2.6 KiB
Rust
86 lines
2.6 KiB
Rust
extern crate core;
|
|
extern crate criterion;
|
|
extern crate seahash;
|
|
|
|
use core::hash::Hasher;
|
|
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
|
|
|
|
fn describe_benches(c: &mut Criterion) {
|
|
// shared buffers for all tests
|
|
let buf = vec![15; 16 * 1024];
|
|
|
|
// shared/n and buffer/n are executed for these sizes
|
|
let sizes = [64, 1024, 4096, 16 * 1024];
|
|
|
|
let mut group = c.benchmark_group("buffer");
|
|
|
|
for size in &sizes {
|
|
group.throughput(Throughput::Bytes(*size as u64));
|
|
|
|
group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, &size| {
|
|
b.iter(|| {
|
|
black_box(seahash::hash(&buf[..size]));
|
|
})
|
|
});
|
|
}
|
|
|
|
group.finish();
|
|
|
|
let mut group = c.benchmark_group("stream");
|
|
|
|
for size in &sizes {
|
|
group.throughput(Throughput::Bytes(*size as u64));
|
|
|
|
group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, &size| {
|
|
b.iter_with_setup(
|
|
|| seahash::SeaHasher::default(),
|
|
|mut h: seahash::SeaHasher| {
|
|
// use chunks of 32 bytes to simulate some looping on a single hasher value
|
|
for _ in 0..size / 32 {
|
|
h.write(&buf[..32]);
|
|
}
|
|
// this will mostly be an empty slice, but that is a possible Hasher api usage
|
|
h.write(&buf[..(size % 32)]);
|
|
black_box(h.finish())
|
|
},
|
|
)
|
|
});
|
|
}
|
|
|
|
group.finish();
|
|
|
|
// gigabyte group times are comparable with earlier benchmark values based on
|
|
// d52d115a223a0e81d1600bd8a5e73cb4b24a38c0
|
|
let mut group = c.benchmark_group("gigabyte");
|
|
group.throughput(Throughput::Bytes((1024 * 1024 * 1024) as u64));
|
|
|
|
group.bench_function(BenchmarkId::from_parameter("buffer"), |b| {
|
|
b.iter(|| {
|
|
let mut buf = [15; 4096];
|
|
let mut total = 0;
|
|
for _ in 0..250_000 {
|
|
total ^= seahash::hash(&buf);
|
|
buf[0] = buf[0].wrapping_add(1);
|
|
}
|
|
black_box(total)
|
|
})
|
|
});
|
|
|
|
group.bench_function(BenchmarkId::from_parameter("stream"), |b| {
|
|
b.iter(|| {
|
|
let mut buf = [15; 4096];
|
|
let mut h = seahash::SeaHasher::default();
|
|
for _ in 0..250_000 {
|
|
h.write(&buf);
|
|
buf[0] = buf[0].wrapping_add(1);
|
|
}
|
|
black_box(h.finish())
|
|
})
|
|
});
|
|
|
|
group.finish();
|
|
}
|
|
|
|
criterion_group!(benches, describe_benches);
|
|
criterion_main!(benches);
|