ax-cache 0.1.0

Hardware-aware concurrent cache engine. Sharded SwissTable with S3-FIFO eviction, fueled by axhash.
Documentation
use ax_cache::Cache;
use criterion::{Criterion, Throughput, criterion_group, criterion_main};
use std::hint::black_box;

const CAPACITY: usize = 100_000;
const SHARDS: usize = 16;

fn populate(cache: &Cache<u64, u64>) {
    for i in 0..CAPACITY as u64 {
        cache.insert(i, i);
    }
}

fn bench_get_hit(c: &mut Criterion) {
    let cache: Cache<u64, u64> = Cache::with_shards(CAPACITY, SHARDS);
    populate(&cache);

    let mut group = c.benchmark_group("single_thread");
    group.throughput(Throughput::Elements(1));
    group.bench_function("get_hit", |b| {
        let mut i = 0u64;
        b.iter(|| {
            let v = cache.get(black_box(&(i % CAPACITY as u64)));
            i = i.wrapping_add(1);
            v
        })
    });
    group.finish();
}

fn bench_get_miss(c: &mut Criterion) {
    let cache: Cache<u64, u64> = Cache::with_shards(CAPACITY, SHARDS);
    populate(&cache);

    let mut group = c.benchmark_group("single_thread");
    group.throughput(Throughput::Elements(1));
    group.bench_function("get_miss", |b| {
        let mut i = (CAPACITY * 10) as u64;
        b.iter(|| {
            let v = cache.get(black_box(&i));
            i = i.wrapping_add(1);
            v
        })
    });
    group.finish();
}

fn bench_insert_new(c: &mut Criterion) {
    let mut group = c.benchmark_group("single_thread");
    group.throughput(Throughput::Elements(1));
    group.bench_function("insert_new", |b| {
        let cache: Cache<u64, u64> = Cache::with_shards(10_000_000, SHARDS);
        let mut i = 0u64;
        b.iter(|| {
            cache.insert(black_box(i), black_box(i));
            i = i.wrapping_add(1);
        })
    });
    group.finish();
}

fn bench_insert_update(c: &mut Criterion) {
    let cache: Cache<u64, u64> = Cache::with_shards(CAPACITY, SHARDS);
    populate(&cache);

    let mut group = c.benchmark_group("single_thread");
    group.throughput(Throughput::Elements(1));
    group.bench_function("insert_update", |b| {
        let mut i = 0u64;
        b.iter(|| {
            cache.insert(black_box(i % CAPACITY as u64), black_box(i));
            i = i.wrapping_add(1);
        })
    });
    group.finish();
}

criterion_group!(
    benches,
    bench_get_hit,
    bench_get_miss,
    bench_insert_new,
    bench_insert_update
);
criterion_main!(benches);