#[cfg(unix)]
mod unix {
use brush_parser::{parse_tokens, tokenize_str};
use criterion::{black_box, Criterion};
fn parse_script(contents: &str) -> brush_parser::ast::Program {
let tokens = tokenize_str(contents).unwrap();
parse_tokens(
&tokens,
&brush_parser::ParserOptions::default(),
&brush_parser::SourceInfo::default(),
)
.unwrap()
}
fn parse_sample_script() -> brush_parser::ast::Program {
let input = r#"
for f in A B C; do
echo "${f@L}" >&2
done
"#;
parse_script(input)
}
fn benchmark_parsing_script(c: &mut Criterion, script_path: &std::path::Path) {
let contents = std::fs::read_to_string(script_path).unwrap();
c.bench_function(
std::format!(
"parse_{}",
script_path.file_name().unwrap().to_string_lossy()
)
.as_str(),
|b| b.iter(|| black_box(parse_script(contents.as_str()))),
);
}
pub(crate) fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("parse_sample_script", |b| {
b.iter(|| black_box(parse_sample_script()))
});
const POSSIBLE_BASH_COMPLETION_SCRIPT_PATH: &str =
"/usr/share/bash-completion/bash_completion";
let well_known_complicated_script =
std::path::PathBuf::from(POSSIBLE_BASH_COMPLETION_SCRIPT_PATH);
if well_known_complicated_script.exists() {
benchmark_parsing_script(c, &well_known_complicated_script);
}
}
}
#[cfg(unix)]
criterion::criterion_group! {
name = benches;
config = criterion::Criterion::default().with_profiler(pprof::criterion::PProfProfiler::new(100, pprof::criterion::Output::Flamegraph(None)));
targets = unix::criterion_benchmark
}
#[cfg(unix)]
criterion::criterion_main!(benches);
#[cfg(not(unix))]
fn main() -> () {}