tlid 0.2.2

Thread Local ID generator by predefined range without atomics/locks/random/time
Documentation
#![feature(test)]
extern crate test;
use test::Bencher;

use tlid::{Checked, Pool, UnChecked, Wrapping};

#[bench]
fn checked_inc(b: &mut Bencher) {
    let mut pool = Pool::<Checked<u64>>::new_full();
    b.iter(|| pool.next().unwrap());
}

#[bench]
fn unchecked_inc(b: &mut Bencher) {
    let mut pool = Pool::<UnChecked<u64>>::new_full();
    b.iter(|| pool.next());
}

#[bench]
fn wraparound_inc(b: &mut Bencher) {
    let mut pool = Pool::<Wrapping<u64>>::new_full();
    b.iter(|| pool.next());
}

#[bench]
fn subpool(b: &mut Bencher) {
    let mut pool = Pool::<Checked<u64>>::new_full();
    b.iter(|| pool.subpool(1000000).unwrap());
}

// cargo bench -- --nocapture

#[bench]
fn time_for_1_000_000_000_runs_checked(_b: &mut Bencher) {
    use std::time::Instant;
    let before = Instant::now();
    // 1,000,000,000 runs
    {
        let mut pool = Pool::<Checked<u64>>::new_full();
        for _ in 0..1000000000 {
            test::black_box(pool.next().unwrap());
        }
    }
    // should take ca. 1.2 seconds
    let after = Instant::now();
    let diff = after.duration_since(before);
    println!("diff: {}s", diff.as_millis() as f64 / 1000.0);
}

#[bench]
fn time_for_1_000_000_000_runs_unchecked(_b: &mut Bencher) {
    use std::time::Instant;
    let before = Instant::now();
    // 1,000,000,000 runs
    {
        let mut pool = Pool::<UnChecked<u64>>::new_full();
        for _ in 0..1000000000 {
            test::black_box(pool.next());
        }
    }
    // should take ca. 0.6 seconds
    let after = Instant::now();
    let diff = after.duration_since(before);
    println!("diff: {}s", diff.as_millis() as f64 / 1000.0);
}