#![allow(clippy::unwrap_used, clippy::expect_used)]
use std::fmt::Write as _;
use std::time::{Duration, Instant};
fn build_script(statements: usize) -> String {
let mut source = String::new();
for i in 0..statements {
let _ = write!(
source,
"if [[ -f f{i}.txt ]]; then\n \
x=$(grep -n needle f{i}.txt | wc -l)\n \
for j in $(seq 1 5); do echo \"$j:${{x}}\"; done\n\
fi\n"
);
}
source
}
fn time_parse(source: &str, iterations: usize) -> Duration {
kaish_kernel::parser::parse(source).expect("fixture must parse (warmup)");
let start = Instant::now();
for _ in 0..iterations {
let program = kaish_kernel::parser::parse(source).expect("fixture must parse");
std::hint::black_box(&program);
}
start.elapsed() / iterations as u32
}
fn main() {
println!(
"{:>8} {:>8} {:>16} {:>14}",
"stmts", "tokens", "lex+parse", "per token (ns)"
);
for statements in [1usize, 2, 5, 10, 20, 50, 100, 200] {
let source = build_script(statements);
let tokens = kaish_kernel::lexer::tokenize(&source)
.expect("fixture must tokenize")
.len();
let iterations = (20_000 / statements).max(20);
let elapsed = time_parse(&source, iterations);
let per_token = elapsed.as_nanos() as f64 / tokens as f64;
println!("{statements:>8} {tokens:>8} {elapsed:>16?} {per_token:>14.1}");
}
}