use std::path::PathBuf;
use std::sync::Arc;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use lex_core::lex::builtins;
use lex_core::lex::includes::{resolve_from_source, FsLoader, ResolveConfig};
use lex_extension_host::registry::Registry;
const GEN_PY_REL: &str = "benches/corpus/gen.py";
fn corpus_root() -> PathBuf {
let raw = if let Ok(p) = std::env::var("BENCH_CORPUS") {
PathBuf::from(p)
} else {
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("benches/corpus")
};
raw.canonicalize().unwrap_or_else(|e| {
panic!(
"could not canonicalise corpus root {}: {e}\nRun: python3 {}/{}",
raw.display(),
env!("CARGO_MANIFEST_DIR"),
GEN_PY_REL,
)
})
}
struct Scenario {
name: &'static str,
dir: &'static str,
}
const SCENARIOS: &[Scenario] = &[
Scenario {
name: "s1_no_includes",
dir: "s1_no_includes",
},
Scenario {
name: "s2_one_small",
dir: "s2_one_small",
},
Scenario {
name: "s3_one_medium",
dir: "s3_one_medium",
},
Scenario {
name: "s4_one_large",
dir: "s4_one_large",
},
Scenario {
name: "s5_many_small",
dir: "s5_many_small",
},
Scenario {
name: "s6_deep_chain",
dir: "s6_deep_chain",
},
Scenario {
name: "s7_realistic",
dir: "s7_realistic",
},
];
fn bench_resolve(c: &mut Criterion) {
let root = corpus_root();
let mut group = c.benchmark_group("include_resolve");
group.measurement_time(std::time::Duration::from_secs(10));
group.warm_up_time(std::time::Duration::from_secs(3));
for sc in SCENARIOS {
let scenario_root = root.join(sc.dir);
let host_path = scenario_root.join("host.lex");
let source = std::fs::read_to_string(&host_path).unwrap_or_else(|e| {
panic!(
"missing fixture {}: {e}\nRun: python3 {}/{}",
host_path.display(),
env!("CARGO_MANIFEST_DIR"),
GEN_PY_REL,
)
});
let loader = Arc::new(FsLoader::new(scenario_root.clone()));
let config = ResolveConfig::with_root(scenario_root.clone());
let registry = Registry::new();
builtins::register_into(®istry, loader, config.clone())
.expect("register lex.* built-ins");
group.bench_function(sc.name, |b| {
b.iter(|| {
let doc = resolve_from_source(
black_box(&source),
black_box(Some(host_path.clone())),
black_box(&config),
black_box(®istry),
)
.expect("resolve must succeed");
black_box(doc);
});
});
}
group.finish();
}
criterion_group!(benches, bench_resolve);
criterion_main!(benches);