2022-10-15 22:29:37 +00:00
|
|
|
#[macro_use]
|
|
|
|
extern crate criterion;
|
2022-11-10 18:43:15 +00:00
|
|
|
extern crate bincode;
|
2022-11-10 19:21:55 +00:00
|
|
|
extern crate serde;
|
|
|
|
extern crate serde_derive;
|
|
|
|
extern crate serde_json;
|
2023-03-29 10:00:17 +00:00
|
|
|
extern crate tempfile;
|
2022-10-15 22:29:37 +00:00
|
|
|
|
2022-11-10 18:43:15 +00:00
|
|
|
use chgk_ledb_lib::db;
|
2023-04-05 13:53:40 +00:00
|
|
|
use std::path::Path;
|
2022-10-15 22:29:37 +00:00
|
|
|
|
|
|
|
use db::{Reader, Writer, WriterOpts};
|
|
|
|
|
|
|
|
use criterion::{BatchSize, Criterion};
|
2023-04-05 13:53:40 +00:00
|
|
|
use tempfile::{tempdir, NamedTempFile};
|
2022-10-15 22:29:37 +00:00
|
|
|
|
2022-11-10 19:21:55 +00:00
|
|
|
use serde_derive::{Deserialize, Serialize};
|
|
|
|
|
|
|
|
#[derive(
|
|
|
|
bincode::Encode,
|
|
|
|
bincode::Decode,
|
|
|
|
Clone,
|
|
|
|
Debug,
|
|
|
|
PartialEq,
|
|
|
|
Eq,
|
|
|
|
PartialOrd,
|
|
|
|
Ord,
|
|
|
|
Serialize,
|
|
|
|
Deserialize,
|
|
|
|
)]
|
2022-10-15 22:29:37 +00:00
|
|
|
struct TestData {
|
2022-11-10 19:21:55 +00:00
|
|
|
num1: u64,
|
|
|
|
num2: u64,
|
2022-10-15 22:29:37 +00:00
|
|
|
test: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
const N: usize = 4096;
|
|
|
|
|
|
|
|
fn gen_data(count: usize) -> impl Iterator<Item = TestData> {
|
2023-04-05 13:53:40 +00:00
|
|
|
(0..count).map(|i| 143 + i as u64).map(|i| TestData {
|
|
|
|
num1: i,
|
|
|
|
num2: (i * 100) ^ 0xDF0E441122334455,
|
|
|
|
test: "test ---- Test ____".repeat(123 + i as usize % 15),
|
|
|
|
})
|
2022-10-15 22:29:37 +00:00
|
|
|
}
|
|
|
|
|
2023-04-05 13:53:40 +00:00
|
|
|
fn prepare_db_writer<P: AsRef<Path>>(path: P) -> Writer<TestData> {
|
2022-10-15 22:29:37 +00:00
|
|
|
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");
|
2023-04-05 13:53:40 +00:00
|
|
|
let tmpfile = NamedTempFile::new_in(dir.path())
|
|
|
|
.expect("new tempfile")
|
|
|
|
.into_temp_path();
|
2022-10-15 22:29:37 +00:00
|
|
|
let mut writer = prepare_db_writer(&tmpfile);
|
|
|
|
|
|
|
|
let mut items_iter = gen_data(N).collect::<Vec<TestData>>().into_iter();
|
|
|
|
writer.load(&mut items_iter).unwrap();
|
|
|
|
writer.finish().unwrap();
|
|
|
|
|
|
|
|
c.bench_function("read", |b| {
|
|
|
|
b.iter_batched(
|
|
|
|
|| {
|
|
|
|
let reader: Reader<TestData> = Reader::new(&tmpfile, 2048).expect("new reader");
|
|
|
|
reader
|
|
|
|
},
|
2023-03-28 12:37:21 +00:00
|
|
|
|reader| {
|
|
|
|
for item in reader {
|
2022-10-15 22:29:37 +00:00
|
|
|
drop(item);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
BatchSize::SmallInput,
|
|
|
|
)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
fn db_write(c: &mut Criterion) {
|
|
|
|
let dir = tempdir().expect("tempdir");
|
2023-04-05 13:53:40 +00:00
|
|
|
|
2022-10-15 22:29:37 +00:00
|
|
|
c.bench_function("write", |b| {
|
|
|
|
b.iter_batched(
|
|
|
|
|| {
|
2023-04-05 13:53:40 +00:00
|
|
|
let tmpfile = NamedTempFile::new_in(dir.path())
|
|
|
|
.expect("new tempfile")
|
|
|
|
.into_temp_path();
|
2022-10-15 22:29:37 +00:00
|
|
|
let src = gen_data(N).collect::<Vec<TestData>>().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)
|
|
|
|
}
|
|
|
|
|
2022-11-09 17:57:21 +00:00
|
|
|
criterion_group! {name=benches; config = config(); targets = db_read, db_write}
|
2023-03-29 10:00:17 +00:00
|
|
|
criterion_main!(benches);
|