iridium-db 0.3.0

A high-performance vector-graph hybrid storage and indexing engine
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())
}