use criterion::{criterion_group, criterion_main, Criterion, Throughput};
use rand_core::RngCore;
fn bench_rdrand(c: &mut Criterion) {
let mut gen = match rdrand::RdRand::new() {
Ok(g) => g,
Err(_) => return,
};
let mut group = c.benchmark_group("rdrand");
group
.throughput(Throughput::Bytes(2))
.bench_function("try_next/u16", move |b| {
b.iter(move || gen.try_next_u16().unwrap())
});
group
.throughput(Throughput::Bytes(4))
.bench_function("try_next/u32", move |b| {
b.iter(move || gen.try_next_u32().unwrap())
});
group
.throughput(Throughput::Bytes(4))
.bench_function("next/u32", move |b| b.iter(move || gen.next_u32()));
group
.throughput(Throughput::Bytes(8))
.bench_function("try_next/u64", move |b| {
b.iter(move || gen.try_next_u64().unwrap())
});
group
.throughput(Throughput::Bytes(8))
.bench_function("next/u64", move |b| b.iter(move || gen.next_u64()));
let mut buffer = [0; 128];
group
.throughput(Throughput::Bytes(128))
.bench_function("try_next/fill128", |b| {
b.iter(|| gen.try_fill_bytes(&mut buffer).unwrap())
});
group
.throughput(Throughput::Bytes(128))
.bench_function("next/fill128", |b| b.iter(|| gen.fill_bytes(&mut buffer)));
group.finish();
}
fn bench_rdseed(c: &mut Criterion) {
let mut gen = match rdrand::RdSeed::new() {
Ok(g) => g,
Err(_) => return,
};
let mut group = c.benchmark_group("rdseed");
group
.throughput(Throughput::Bytes(2))
.bench_function("try_next/u16", move |b| {
b.iter(move || gen.try_next_u16().unwrap())
});
group
.throughput(Throughput::Bytes(4))
.bench_function("try_next/u32", move |b| {
b.iter(move || gen.try_next_u32().unwrap())
});
group
.throughput(Throughput::Bytes(4))
.bench_function("next/u32", move |b| b.iter(move || gen.next_u32()));
group
.throughput(Throughput::Bytes(8))
.bench_function("try_next/u64", move |b| {
b.iter(move || gen.try_next_u64().unwrap())
});
group
.throughput(Throughput::Bytes(8))
.bench_function("next/u64", move |b| b.iter(move || gen.next_u64()));
let mut buffer = [0; 128];
group
.throughput(Throughput::Bytes(128))
.bench_function("try_next/fill128", |b| {
b.iter(|| gen.try_fill_bytes(&mut buffer).unwrap())
});
group
.throughput(Throughput::Bytes(128))
.bench_function("next/fill128", |b| b.iter(|| gen.fill_bytes(&mut buffer)));
group.finish();
}
criterion_group!(benches, bench_rdrand, bench_rdseed);
criterion_main!(benches);