#![allow(
clippy::cast_lossless,
clippy::cast_possible_truncation,
clippy::cast_precision_loss,
clippy::cast_sign_loss,
clippy::doc_markdown,
clippy::useless_conversion,
clippy::similar_names
)]
use criterion::{Criterion, black_box, criterion_group, criterion_main};
use spg_storage::{Catalog, ColumnSchema, DataType, Row, TableSchema, Value};
use std::env::temp_dir;
use std::fs;
fn write_seed_catalog(path: &std::path::Path) {
let mut cat = Catalog::new();
cat.create_table(TableSchema::new(
"users",
vec![
ColumnSchema::new("id", DataType::Int, false),
ColumnSchema::new("name", DataType::Text, false),
],
))
.unwrap();
let t = cat.get_mut("users").unwrap();
for i in 0..100 {
t.insert(Row::new(vec![
Value::Int(i),
Value::text(format!("user-{i}")),
]))
.unwrap();
}
fs::write(path, cat.serialize()).unwrap();
}
fn bench_backup_roundtrip(c: &mut Criterion) {
let src = temp_dir().join("spg-cli-bench-src.spgdb");
let dst = temp_dir().join("spg-cli-bench-dst.spgdb");
write_seed_catalog(&src);
c.bench_function("backup_roundtrip_100rows", |b| {
b.iter(|| {
let bytes = fs::read(black_box(&src)).expect("read");
let cat = Catalog::deserialize(&bytes).expect("deserialize");
let out = cat.serialize();
fs::write(black_box(&dst), out).expect("write");
});
});
let _ = fs::remove_file(&src);
let _ = fs::remove_file(&dst);
}
fn bench_backup_inmemory(c: &mut Criterion) {
let mut cat = Catalog::new();
cat.create_table(spg_storage::TableSchema::new(
"users",
vec![
spg_storage::ColumnSchema::new("id", spg_storage::DataType::Int, false),
spg_storage::ColumnSchema::new("name", spg_storage::DataType::Text, false),
],
))
.unwrap();
let t = cat.get_mut("users").unwrap();
for i in 0..100 {
t.insert(spg_storage::Row::new(vec![
spg_storage::Value::Int(i),
spg_storage::Value::text(format!("user-{i}")),
]))
.unwrap();
}
let src_bytes = cat.serialize();
c.bench_function("backup_inmemory_100rows", |b| {
b.iter(|| {
let parsed = Catalog::deserialize(black_box(&src_bytes)).expect("deserialize");
let out = parsed.serialize();
black_box(out);
});
});
}
criterion_group!(benches, bench_backup_roundtrip, bench_backup_inmemory);
criterion_main!(benches);