use redb::{Database, ReadableTable, TableDefinition};
use std::time::Instant;
const T: TableDefinition<&[u8], &[u8]> = TableDefinition::new("bench");
const N: usize = 20_000;
fn main() {
let file = tempfile::NamedTempFile::new().unwrap();
let db = Database::create(file.path()).unwrap();
let txn = db.begin_write().unwrap();
{
let mut t = txn.open_table(T).unwrap();
for i in 0..N {
t.insert(&i.to_be_bytes()[..], &vec![7u8; 1600][..])
.unwrap();
}
}
txn.commit().unwrap();
let txn = db.begin_write().unwrap();
let t0 = Instant::now();
{
let tbl = txn.open_table(T).unwrap();
for i in 0..N {
std::hint::black_box(
tbl.get(&i.to_be_bytes()[..])
.unwrap()
.map(|v| v.value().len()),
);
}
}
let cached = t0.elapsed();
let t0 = Instant::now();
for i in 0..N {
let tbl = txn.open_table(T).unwrap();
std::hint::black_box(
tbl.get(&i.to_be_bytes()[..])
.unwrap()
.map(|v| v.value().len()),
);
}
let per_call = t0.elapsed();
txn.abort().unwrap();
println!("{N} point reads on a write transaction:");
println!(
" one open_table, N gets {cached:>10.2?} ({:>6.3} µs/get)",
cached.as_secs_f64() * 1e6 / N as f64
);
println!(
" open_table per get {per_call:>10.2?} ({:>6.3} µs/get)",
per_call.as_secs_f64() * 1e6 / N as f64
);
println!(
" open_table overhead {:>10.3} µs/get",
(per_call.as_secs_f64() - cached.as_secs_f64()) * 1e6 / N as f64
);
}