#[macro_use] extern crate criterion; extern crate bincode; extern crate tempfile; use chgk_ledb_lib::db; use std::path::PathBuf; use db::{Reader, Writer, WriterOpts}; use criterion::{BatchSize, Criterion}; use tempfile::tempdir; #[derive(bincode::Encode, bincode::Decode, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] struct TestData { num: u128, test: String, } const N: usize = 4096; fn gen_data(count: usize) -> impl Iterator { (0..count) .into_iter() .map(|i| 143 + i as u128) .map(|i| TestData { num: i, test: "test ---- Test ____".repeat(123 + i as usize % 15), }) } fn prepare_db_writer(path: &PathBuf) -> Writer { let opts = WriterOpts { compress_lvl: 1, data_buf_size: 100 * 1024 * 1024, out_buf_size: 100 * 1024 * 1024, current_buf_size: 10240, }; Writer::new(path, opts).expect("new writer") } fn db_read(c: &mut Criterion) { let dir = tempdir().expect("tempdir"); let tmpfile = dir.path().join("test.tmp"); let mut writer = prepare_db_writer(&tmpfile); let mut items_iter = gen_data(N).collect::>().into_iter(); writer.load(&mut items_iter).unwrap(); writer.finish().unwrap(); c.bench_function("read", |b| { b.iter_batched( || { let reader: Reader = Reader::new(&tmpfile, 2048).expect("new reader"); reader }, |mut reader| { let mut reader_iter = reader.iter(); while let Some(item) = reader_iter.next() { drop(item); } }, BatchSize::SmallInput, ) }); } fn db_write(c: &mut Criterion) { let dir = tempdir().expect("tempdir"); let tmpfile = dir.path().join("test.tmp"); c.bench_function("write", |b| { b.iter_batched( || { let src = gen_data(N).collect::>().into_iter(); let writer = prepare_db_writer(&tmpfile); (src, writer) }, |(mut src, mut writer)| { writer.load(&mut src).unwrap(); writer.finish().unwrap(); }, BatchSize::SmallInput, ) }); } fn config() -> Criterion { Criterion::default().sample_size(40) } criterion_group! {name=benches; config = config(); targets = db_read, db_write} criterion_main!(benches);