Source code
Revision control
Copy as Markdown
Other Tools
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);