//! Benchmark end-to-end append and sync cadence. use super::{CACHE_SIZE, PAGE_SIZE, WRITE_BUFFER_SIZE, create_append, destroy_append}; use commonware_runtime::{ BufferPooler, Runner, Storage, buffer::paged::CacheRef, deterministic, tokio, }; use commonware_utils::NZUsize; use criterion::Criterion; use std::time::Instant; const RECORD_SIZE: usize = 256; fn bench_runner(c: &mut Criterion, runner: &str, per_sync: usize) where R: Runner + Default, R::Context: Storage + BufferPooler, { c.bench_function( &format!( "{}/runner={runner} per_sync={per_sync} record_size={RECORD_SIZE} write_buffer={WRITE_BUFFER_SIZE}", module_path!() ), |b| { b.iter_custom(|iters| { let name = format!("sync_{runner}_{per_sync}").into_bytes(); let data = vec![0xABu8; RECORD_SIZE]; R::default().start(|ctx| async move { let cache_ref = CacheRef::from_pooler(&ctx, PAGE_SIZE, NZUsize!(CACHE_SIZE)); let mut writer = create_append(&ctx, &name, cache_ref).await; let start = Instant::now(); for _ in 0..iters { for _ in 0..per_sync { writer.append(&data).await.unwrap(); } writer.sync().await.unwrap(); } let elapsed = start.elapsed(); destroy_append(&ctx, writer, &name).await; elapsed }) }); }, ); } pub fn bench(c: &mut Criterion) { for per_sync in [1, 16] { bench_runner::(c, "deterministic", per_sync); bench_runner::(c, "tokio", per_sync); } }