[go: up one dir, main page]

rdrand 0.8.1

An implementation of random number generator based on rdrand and rdseed instructions
Documentation
use rand_core::RngCore;
use criterion::{criterion_group, criterion_main, Criterion, Throughput};

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);