use std::hint::black_box;
use criterion::{criterion_group, criterion_main, BatchSize, Criterion};
use mnemo::{Memory, MemoryType, Mnemo};
use tempfile::TempDir;
#[path = "corpus.rs"]
mod corpus;
use corpus::{fast_kdf_cfg, gen_clustered_vectors, DIMENSIONS, PASSPHRASE};
fn bench_remember_batch_100_then_flush(c: &mut Criterion) {
let mut group = c.benchmark_group("write");
group.sample_size(50);
group.throughput(criterion::Throughput::Elements(100));
group.bench_function("remember_batch_100_then_flush", |b| {
let vectors: Vec<Vec<f32>> = gen_clustered_vectors(100, DIMENSIONS, 16, 0xC001_BA75);
b.iter_batched(
|| {
let td = TempDir::new().expect("tempdir");
let path = td.path().join("bench.mnemo");
let db =
Mnemo::create(&path, PASSPHRASE, fast_kdf_cfg(DIMENSIONS)).expect("create");
(td, db)
},
|(_td, mut db)| {
for (i, v) in vectors.iter().enumerate() {
let content = format!("bench memory #{i}");
let m = Memory::new(content, MemoryType::Semantic, v.clone());
let _ = black_box(db.remember(m).expect("remember"));
}
db.flush().expect("flush");
},
BatchSize::SmallInput,
);
});
group.finish();
}
fn bench_remember_1_then_flush(c: &mut Criterion) {
let mut group = c.benchmark_group("write");
group.sample_size(50);
group.throughput(criterion::Throughput::Elements(1));
group.bench_function("remember_1_then_flush", |b| {
let vector = gen_clustered_vectors(1, DIMENSIONS, 1, 0xC001_BA76)
.into_iter()
.next()
.unwrap();
b.iter_batched(
|| {
let td = TempDir::new().expect("tempdir");
let path = td.path().join("bench.mnemo");
let db =
Mnemo::create(&path, PASSPHRASE, fast_kdf_cfg(DIMENSIONS)).expect("create");
(td, db)
},
|(_td, mut db)| {
let m = Memory::new(
"single bench memory".to_string(),
MemoryType::Semantic,
vector.clone(),
);
let _ = black_box(db.remember(m).expect("remember"));
db.flush().expect("flush");
},
BatchSize::SmallInput,
);
});
group.finish();
}
criterion_group!(
write_benches,
bench_remember_batch_100_then_flush,
bench_remember_1_then_flush,
);
criterion_main!(write_benches);