use super::{create_append, destroy_append, CACHE_SIZE, PAGE_SIZE, PAGE_SIZE_USIZE};
use commonware_runtime::{buffer::paged::CacheRef, deterministic, Runner as _};
use commonware_utils::NZUsize;
use criterion::Criterion;
use rand::{rngs::StdRng, Rng, SeedableRng};
use std::time::Instant;
const TOTAL_PAGES: usize = CACHE_SIZE;
const TOTAL_SIZE: usize = PAGE_SIZE_USIZE * TOTAL_PAGES;
pub fn bench(c: &mut Criterion) {
for read_size in [64, 256, 1024, 4096] {
let name = format!("read_{read_size}").into_bytes();
c.bench_function(&format!("{}/size={}", module_path!(), read_size), |b| {
b.iter_custom(|iters| {
let name = name.clone();
let executor = deterministic::Runner::default();
executor.start(|ctx| async move {
let cache_ref = CacheRef::from_pooler(&ctx, PAGE_SIZE, NZUsize!(CACHE_SIZE));
let append = create_append(&ctx, &name, cache_ref.clone()).await;
let data = vec![0xABu8; TOTAL_SIZE];
append.append(&data).await.unwrap();
append.sync().await.unwrap();
drop(append);
let append = create_append(&ctx, &name, cache_ref.clone()).await;
let mut buf = vec![0u8; read_size];
let max_offset = TOTAL_SIZE - read_size;
let mut rng = StdRng::seed_from_u64(42);
let start = Instant::now();
for _ in 0..iters {
for _ in 0..TOTAL_PAGES * 100 {
let offset = rng.gen_range(0..=max_offset) as u64;
append.read_into(&mut buf, offset).await.unwrap();
}
}
let elapsed = start.elapsed();
destroy_append(&ctx, append, &name).await;
elapsed
})
});
});
}
}