use criterion::{Criterion, black_box, criterion_group};
use std::time::Duration;
use vsdb_core::MapxRaw;
fn single_inserts(c: &mut Criterion) {
let mut group = c.benchmark_group("vsdb_core::mapx_raw / batch_write");
group
.measurement_time(std::time::Duration::from_secs(3))
.sample_size(10);
group.bench_function(" single inserts (1000 ops) ", |b| {
b.iter(|| {
let mut db = MapxRaw::new();
for i in 0usize..1000 {
let key = i.to_be_bytes();
let value = (i * 2).to_be_bytes();
db.insert(&key, &value);
}
black_box(db);
})
});
group.finish();
}
fn mixed_workload(c: &mut Criterion) {
let mut group = c.benchmark_group("vsdb_core::mapx_raw / mixed");
group
.measurement_time(std::time::Duration::from_secs(3))
.sample_size(10);
group.bench_function(" 80% read / 20% write (1000 ops) ", |b| {
b.iter(|| {
let mut db = MapxRaw::new();
for i in 0usize..800 {
let key = i.to_be_bytes();
let value = i.to_be_bytes();
db.insert(&key, &value);
}
for i in 0usize..1000 {
if i % 5 == 0 {
let key = (800 + i / 5).to_be_bytes();
let value = i.to_be_bytes();
db.insert(&key, &value);
} else {
let key = (i % 800).to_be_bytes();
black_box(db.get(&key));
}
}
black_box(db);
})
});
group.finish();
}
fn range_scans(c: &mut Criterion) {
let mut group = c.benchmark_group("vsdb_core::mapx_raw / range_scan");
group
.measurement_time(std::time::Duration::from_secs(3))
.sample_size(10);
let mut db = MapxRaw::new();
for i in 0u64..10000u64 {
let key = i.to_be_bytes();
let value = i.to_be_bytes();
db.insert(&key, &value);
}
group.bench_function(" scan 100 entries ", |b| {
b.iter(|| {
let count = db.iter().take(100).count();
black_box(count);
})
});
group.bench_function(" scan 1000 entries ", |b| {
b.iter(|| {
let count = db.iter().take(1000).count();
black_box(count);
})
});
group.finish();
}
criterion_group!(benches, single_inserts, mixed_workload, range_scans);