zk-alloc 0.0.9

Bump+reset arena allocator for ZK proving workloads
Documentation
use criterion::{criterion_group, criterion_main, Criterion};
use std::alloc::{GlobalAlloc, Layout};

use zk_alloc::ZkAllocator;

static ZK: ZkAllocator = ZkAllocator;

fn bench_small_alloc(c: &mut Criterion) {
    let layout = Layout::from_size_align(64, 8).unwrap();
    c.bench_function("small_alloc_dealloc_64B", |b| {
        b.iter(|| unsafe {
            let ptr = ZK.alloc(layout);
            std::hint::black_box(ptr);
            ZK.dealloc(ptr, layout);
        });
    });
}

fn bench_medium_alloc(c: &mut Criterion) {
    let layout = Layout::from_size_align(4096, 8).unwrap();
    c.bench_function("medium_alloc_dealloc_4KB", |b| {
        b.iter(|| unsafe {
            let ptr = ZK.alloc(layout);
            std::hint::black_box(ptr);
            ZK.dealloc(ptr, layout);
        });
    });
}

fn bench_large_alloc(c: &mut Criterion) {
    let layout = Layout::from_size_align(4 * 1024 * 1024, 8).unwrap();
    c.bench_function("large_alloc_dealloc_4MB", |b| {
        b.iter(|| unsafe {
            let ptr = ZK.alloc(layout);
            std::hint::black_box(ptr);
            ZK.dealloc(ptr, layout);
        });
    });
}

fn bench_arena_bump(c: &mut Criterion) {
    zk_alloc::begin_phase();
    let layout = Layout::from_size_align(64, 8).unwrap();
    c.bench_function("arena_bump_64B", |b| {
        b.iter(|| unsafe {
            let ptr = ZK.alloc(layout);
            std::hint::black_box(ptr);
        });
    });
    zk_alloc::end_phase();
}

criterion_group!(
    benches,
    bench_small_alloc,
    bench_medium_alloc,
    bench_large_alloc,
    bench_arena_bump,
);
criterion_main!(benches);