#![allow(missing_docs)] #![allow(clippy::unwrap_used, clippy::expect_used)]
use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
use cuengine::{ModuleEvalOptions, evaluate_cue_package, evaluate_module};
use std::fmt::Write;
use std::fs;
use std::hint::black_box;
use std::path::PathBuf;
use tempfile::TempDir;
fn create_flat_cue_file(size: usize) -> String {
let mut content = String::from("package bench\n\nenv: {\n");
for i in 0..size {
writeln!(content, " VAR_{i}: \"value_{i}\"").unwrap();
}
content.push('}');
content
}
fn create_nested_cue_file(depth: usize) -> String {
let mut content = String::from("package bench\n\nroot: {\n");
let indent_base = " ";
for level in 0..depth {
let indent = indent_base.repeat(level + 1);
writeln!(content, "{indent}level{level}: {{").unwrap();
}
let leaf_indent = indent_base.repeat(depth + 1);
writeln!(content, "{leaf_indent}value: \"deep\"").unwrap();
for level in (0..depth).rev() {
let indent = indent_base.repeat(level + 1);
writeln!(content, "{indent}}}").unwrap();
}
content.push('}');
content
}
fn create_wide_cue_file(width: usize) -> String {
let mut content = String::from("package bench\n\nconfig: {\n");
for i in 0..width {
writeln!(content, " field{i}: \"value{i}\"").unwrap();
}
content.push('}');
content
}
fn create_reference_heavy_cue_file(count: usize) -> String {
let mut content =
String::from("package bench\n\nlet _base = { value: \"shared\" }\n\nitems: {\n");
for i in 0..count {
writeln!(content, " item{i}: _base").unwrap();
}
content.push('}');
content
}
fn setup_cue_module(dir: &TempDir) {
let cue_mod = dir.path().join("cue.mod");
fs::create_dir_all(&cue_mod).unwrap();
fs::write(cue_mod.join("module.cue"), "module: \"bench.test\"\n").unwrap();
}
fn benchmark_evaluation(c: &mut Criterion) {
let mut group = c.benchmark_group("evaluation");
for size in &[10, 100, 1000] {
let temp_dir = TempDir::new().unwrap();
let content = create_flat_cue_file(*size);
fs::write(temp_dir.path().join("bench.cue"), content).unwrap();
group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, _| {
b.iter(|| evaluate_cue_package(black_box(temp_dir.path()), black_box("bench")));
});
}
group.finish();
}
fn benchmark_memory_usage(c: &mut Criterion) {
c.bench_function("large_config_evaluation", |b| {
let temp_dir = TempDir::new().unwrap();
let content = create_flat_cue_file(10000);
fs::write(temp_dir.path().join("large.cue"), content).unwrap();
b.iter(|| evaluate_cue_package(black_box(temp_dir.path()), black_box("bench")));
});
}
fn benchmark_module_evaluation(c: &mut Criterion) {
let mut group = c.benchmark_group("module_evaluation");
for size in &[10, 100, 500] {
let temp_dir = TempDir::new().unwrap();
setup_cue_module(&temp_dir);
let content = create_flat_cue_file(*size);
fs::write(temp_dir.path().join("bench.cue"), content).unwrap();
let options = ModuleEvalOptions::default();
group.bench_with_input(BenchmarkId::from_parameter(size), size, |b, _| {
b.iter(|| {
evaluate_module(
black_box(temp_dir.path()),
black_box("bench"),
Some(&options),
)
});
});
}
group.finish();
}
fn benchmark_reference_extraction(c: &mut Criterion) {
let mut group = c.benchmark_group("reference_extraction");
let temp_dir = TempDir::new().unwrap();
setup_cue_module(&temp_dir);
let content = create_reference_heavy_cue_file(100);
fs::write(temp_dir.path().join("bench.cue"), content).unwrap();
let options_no_refs = ModuleEvalOptions {
with_references: false,
..Default::default()
};
group.bench_function("without_references", |b| {
b.iter(|| {
evaluate_module(
black_box(temp_dir.path()),
black_box("bench"),
Some(&options_no_refs),
)
});
});
let options_with_refs = ModuleEvalOptions {
with_references: true,
..Default::default()
};
group.bench_function("with_references", |b| {
b.iter(|| {
evaluate_module(
black_box(temp_dir.path()),
black_box("bench"),
Some(&options_with_refs),
)
});
});
group.finish();
}
fn benchmark_nested_structures(c: &mut Criterion) {
let mut group = c.benchmark_group("nested_structures");
for depth in &[10, 25, 50] {
let temp_dir = TempDir::new().unwrap();
setup_cue_module(&temp_dir);
let content = create_nested_cue_file(*depth);
fs::write(temp_dir.path().join("bench.cue"), content).unwrap();
let options_no_refs = ModuleEvalOptions {
with_references: false,
..Default::default()
};
group.bench_with_input(BenchmarkId::new("no_refs", depth), depth, |b, _| {
b.iter(|| {
evaluate_module(
black_box(temp_dir.path()),
black_box("bench"),
Some(&options_no_refs),
)
});
});
let options_with_refs = ModuleEvalOptions {
with_references: true,
..Default::default()
};
group.bench_with_input(BenchmarkId::new("with_refs", depth), depth, |b, _| {
b.iter(|| {
evaluate_module(
black_box(temp_dir.path()),
black_box("bench"),
Some(&options_with_refs),
)
});
});
}
group.finish();
}
fn benchmark_wide_structures(c: &mut Criterion) {
let mut group = c.benchmark_group("wide_structures");
for width in &[100, 500, 1000] {
let temp_dir = TempDir::new().unwrap();
setup_cue_module(&temp_dir);
let content = create_wide_cue_file(*width);
fs::write(temp_dir.path().join("bench.cue"), content).unwrap();
let options_with_refs = ModuleEvalOptions {
with_references: true,
..Default::default()
};
group.bench_with_input(BenchmarkId::from_parameter(width), width, |b, _| {
b.iter(|| {
evaluate_module(
black_box(temp_dir.path()),
black_box("bench"),
Some(&options_with_refs),
)
});
});
}
group.finish();
}
fn benchmark_real_world(c: &mut Criterion) {
let mut group = c.benchmark_group("real_world");
let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
let workspace_root = manifest_dir.parent().unwrap().parent().unwrap();
if !workspace_root.join("env.cue").exists() {
return;
}
let options_no_refs = ModuleEvalOptions {
with_references: false,
..Default::default()
};
group.bench_function("env_cue_no_refs", |b| {
b.iter(|| {
evaluate_module(
black_box(workspace_root),
black_box("cuenv"),
Some(&options_no_refs),
)
});
});
let options_with_refs = ModuleEvalOptions {
with_references: true,
..Default::default()
};
group.bench_function("env_cue_with_refs", |b| {
b.iter(|| {
evaluate_module(
black_box(workspace_root),
black_box("cuenv"),
Some(&options_with_refs),
)
});
});
group.finish();
}
criterion_group!(
benches,
benchmark_evaluation,
benchmark_memory_usage,
benchmark_module_evaluation,
benchmark_reference_extraction,
benchmark_nested_structures,
benchmark_wide_structures,
benchmark_real_world,
);
criterion_main!(benches);