use std::path::{Path, PathBuf};
use iridium::features::storage::bench::{BenchRunner, BenchSuiteResult};
pub(super) fn run_bench_command(iterations: u64, seed: u64, json_out: Option<PathBuf>) {
let base_dir = PathBuf::from("./bench_data");
std::fs::create_dir_all(&base_dir).ok();
match BenchRunner::run_storage_suite(iterations, seed, &base_dir) {
Ok(result) => {
print_bench_summary(&result);
let json_path =
json_out.unwrap_or_else(|| PathBuf::from("./artifacts/bench_result.json"));
if let Err(err) = write_bench_json(&json_path, &result) {
eprintln!(
"failed to write bench json to {}: {}",
json_path.display(),
err
);
std::process::exit(1);
}
println!("json_report: {}", json_path.display());
}
Err(err) => {
eprintln!("bench failed: {:?}", err);
std::process::exit(1);
}
}
}
fn print_bench_summary(result: &BenchSuiteResult) {
println!("seed: {}", result.seed);
println!("iterations: {}", result.iterations);
println!("basic_ops_per_sec: {:.2}", result.basic_put_get.ops_per_sec);
println!("ingest_edges_per_sec: {:.2}", result.ingest.edges_per_sec);
println!("traversal_p50_us: {:.2}", result.traversal.p50_micros);
println!("traversal_p95_us: {:.2}", result.traversal.p95_micros);
println!("traversal_p99_us: {:.2}", result.traversal.p99_micros);
println!("write_amp: {:?}", result.amplification.write_amp);
println!("read_amp: {:?}", result.amplification.read_amp);
println!("space_amp: {:?}", result.amplification.space_amp);
}
fn write_bench_json(path: &Path, result: &BenchSuiteResult) -> std::io::Result<()> {
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent)?;
}
std::fs::write(path, result.to_json_pretty())
}