diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2024-10-05 09:46:30 +0200 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2024-10-05 09:46:30 +0200 |
| commit | 47672de7f4fb917068923176658198d00d393ec8 (patch) | |
| tree | 840cdd2f7dfff376cfcddbffb0c7175f00f4f3d3 /benches | |
| parent | 9001c82c6004d87d95bc9007bf195489635f5e83 (diff) | |
Add some initial benchmarks
Diffstat (limited to 'benches')
| -rw-r--r-- | benches/benchmark.rs | 77 | ||||
| -rw-r--r-- | benches/utils.rs | 46 |
2 files changed, 123 insertions, 0 deletions
diff --git a/benches/benchmark.rs b/benches/benchmark.rs new file mode 100644 index 0000000..b9ecbb3 --- /dev/null +++ b/benches/benchmark.rs @@ -0,0 +1,77 @@ +mod utils; + +use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; +use log_db::*; +use tempfile; +use utils::*; + +#[derive(Eq, PartialEq, Clone, Debug)] +enum Field { + Id, + Name, + Data, +} + +pub fn upsert_benchmark(c: &mut Criterion) { + let mut group = c.benchmark_group("db.upsert"); + + for size in [0, 10, 100, 1000, 10000] { + let data_dir_obj = tempfile::tempdir().expect("Failed to get tmpdir"); + let data_dir = &data_dir_obj + .path() + .to_str() + .expect("Failed to convert tmpdir path to str"); + let mut db = DB::configure() + .data_dir(&data_dir) + .fields(&vec![ + (Field::Id, RecordFieldType::Int), + (Field::Name, RecordFieldType::String), + (Field::Data, RecordFieldType::Bytes), + ]) + .primary_key(Field::Id) + .initialize() + .expect("Failed to initialize DB"); + prefill_db_with_n_records(&mut db, size).expect("Failed to prefill DB"); + + group.bench_with_input(BenchmarkId::from_parameter(size), &size, |b, &_size| { + b.iter(|| { + let record = random_record(); + let _ = db.upsert(black_box(&record)); + }); + }); + } +} + +pub fn get_benchmark(c: &mut Criterion) { + let mut group = c.benchmark_group("db.get"); + + for size in [0, 10, 100, 1000, 10000] { + let data_dir_obj = tempfile::tempdir().expect("Failed to get tmpdir"); + let data_dir = &data_dir_obj + .path() + .to_str() + .expect("Failed to convert tmpdir path to str"); + let mut db = DB::configure() + .data_dir(&data_dir) + .fields(&vec![ + (Field::Id, RecordFieldType::Int), + (Field::Name, RecordFieldType::String), + (Field::Data, RecordFieldType::Bytes), + ]) + .primary_key(Field::Id) + .initialize() + .expect("Failed to initialize DB"); + prefill_db_with_n_records(&mut db, size).expect("Failed to prefill DB"); + + group.bench_with_input(BenchmarkId::from_parameter(size), &size, |b, &_size| { + b.iter(|| { + let id = random_int(); + let _ = db.get(black_box(&RecordValue::Int(id))); + }); + }); + } +} + +// Register the benchmark group +criterion_group!(benches, upsert_benchmark, get_benchmark); +criterion_main!(benches); diff --git a/benches/utils.rs b/benches/utils.rs new file mode 100644 index 0000000..9f20e3c --- /dev/null +++ b/benches/utils.rs @@ -0,0 +1,46 @@ +use log_db::*; +use rand::distributions::Alphanumeric; +use rand::Rng; +use std::fmt::Debug; +use std::io; + +// Function to generate a random integer +pub fn random_int() -> i64 { + let mut rng = rand::thread_rng(); + rng.gen_range(0..1000) // Random number between 0 and 1000 +} + +// Function to generate a random string +pub fn random_string(len: usize) -> String { + let mut rng = rand::thread_rng(); + (0..len).map(|_| rng.sample(Alphanumeric) as char).collect() +} + +// Function to generate random bytes +pub fn random_bytes(len: usize) -> Vec<u8> { + let mut rng = rand::thread_rng(); + (0..len).map(|_| rng.gen()).collect() +} + +// Function to generate a random record +pub fn random_record() -> Record { + Record { + values: vec![ + RecordValue::Int(random_int()), // Random int value + RecordValue::String(random_string(5)), // Random string of length 5 + RecordValue::Bytes(random_bytes(10)), // Random bytes of length 10 + ], + } +} + +pub fn prefill_db_with_n_records<T: Eq + Clone + Debug>( + db: &mut DB<T>, + n: usize, +) -> Result<(), io::Error> { + for _ in 0..n { + let record = random_record(); + db.upsert(&record)?; + } + + Ok(()) +} |
