use std::path::Path;
use std::time::{Duration, Instant};
use crate::config::Config;
use crate::error::Result;
use crate::project::ProjectLayout;
use crate::store::Store;
use crate::store::hierarchy::Hierarchy;
pub fn run(project: &Path, query: &str, iterations: usize) -> Result<()> {
let layout = ProjectLayout::new(project);
layout.require_initialized()?;
let cfg = Config::load(&layout.config_path())?;
println!("inkhaven _bench-load — v{}", env!("CARGO_PKG_VERSION"));
println!("project: {}", project.display());
println!("iterations: {iterations}");
println!();
let t = Instant::now();
let store = Store::open(layout.clone(), &cfg)?;
let store_open = t.elapsed();
report("store_open", store_open);
let t = Instant::now();
let hierarchy = Hierarchy::load(&store)?;
let hierarchy_load = t.elapsed();
report("hierarchy_load", hierarchy_load);
let node_count = hierarchy.iter().count();
println!("nodes: {node_count}");
let mut flatten_total = Duration::ZERO;
let mut flatten_rows = 0usize;
for _ in 0..iterations {
let t = Instant::now();
let rows = hierarchy.flatten();
flatten_total += t.elapsed();
flatten_rows = rows.len();
}
report_avg("flatten", flatten_total, iterations);
println!("flatten_rows: {flatten_rows}");
let mut search_total = Duration::ZERO;
let mut hits = 0usize;
for _ in 0..iterations {
let t = Instant::now();
let results = store.search_text(query, 10)?;
search_total += t.elapsed();
hits = results.len();
}
report_avg("search", search_total, iterations);
println!("search_hits: {hits} (query: {query:?})");
println!();
println!(
"total_cold_load: {:.2}ms (store_open + hierarchy_load)",
(store_open + hierarchy_load).as_secs_f64() * 1000.0,
);
Ok(())
}
fn report(label: &str, elapsed: Duration) {
println!("{label:<16} {:>10.2}ms", elapsed.as_secs_f64() * 1000.0);
}
fn report_avg(label: &str, total: Duration, iterations: usize) {
let avg = total.as_secs_f64() * 1000.0 / iterations.max(1) as f64;
println!("{label:<16} {avg:>10.2}ms (avg of {iterations})");
}