--- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,2 +1,5 @@ /cpp_test_suite /go_testdata +/go_builtin_benchmarks +/cpp_benchmarks +/cpp_perf_tests --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -29,5 +29,5 @@ bench = false [[bench]] -name = "prim_comparsion" +name = "cpp_test_suite" harness = false --- /dev/null +++ b/tests/benches/cpp_test_suite.rs @@ -0,0 +1,56 @@ +use std::{collections::HashMap, fs::read_dir, hint::black_box, path::Path}; + +use criterion::{Criterion, criterion_group, criterion_main}; +use jrsonnet_evaluator::{ + FileImportResolver, State, apply_tla, manifest::JsonFormat, trace::PathResolver, +}; + +fn bench_entry(c: &mut Criterion, path: &Path) { + c.bench_function( + path.file_name() + .expect("file path") + .to_str() + .expect("name is utf-8"), + |b| { + let mut s = State::builder(); + + s.context_initializer(jrsonnet_stdlib::ContextInitializer::new( + PathResolver::Absolute, + )) + .import_resolver(FileImportResolver::new(vec![])); + + let s = s.build(); + let _s = s.enter(); + + b.iter(|| { + let imported = s.import(path).expect("evaluated"); + let res = apply_tla(&HashMap::new(), imported).expect("tla applied"); + black_box(res.manifest(JsonFormat::cli(3))) + }); + }, + ); +} +fn criterion_benchmark(c: &mut Criterion) { + for entry in read_dir("go_builtin_benchmarks").expect("dir exists") { + let entry = entry.expect("entry is valid"); + assert!(entry.metadata().expect("entry is valid").is_file()); + bench_entry(c, &entry.path()); + } + for entry in read_dir("cpp_perf_tests").expect("dir exists") { + let entry = entry.expect("entry is valid"); + assert!(entry.metadata().expect("entry is valid").is_file()); + bench_entry(c, &entry.path()); + } + for entry in read_dir("cpp_benchmarks").expect("dir exists") { + let entry = entry.expect("entry is valid"); + // Skip .gitignore + if entry.path().extension().is_none() { + continue; + } + assert!(entry.metadata().expect("entry is valid").is_file()); + bench_entry(c, &entry.path()); + } +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); --- a/tests/benches/prim_comparsion.rs +++ /dev/null @@ -1,32 +0,0 @@ -use std::hint::black_box; - -use criterion::{Criterion, criterion_group, criterion_main}; -use jrsonnet_evaluator::{State, manifest::JsonFormat, trace::PathResolver}; - -fn criterion_benchmark(c: &mut Criterion) { - c.bench_function("prim_comparison", |b| { - let mut s = State::builder(); - - s.context_initializer(jrsonnet_stdlib::ContextInitializer::new( - PathResolver::Absolute, - )); - - let s = s.build(); - let _s = s.enter(); - - b.iter(|| { - black_box( - s.evaluate_snippet( - "snippet", - "([ i < j for i in std.range(1, 1000) for j in std.range(1, 1000)])", - ) - .expect("evaluated") - .manifest(JsonFormat::cli(3)) - .expect("manifested"), - ) - }); - }); -} - -criterion_group!(benches, criterion_benchmark); -criterion_main!(benches); --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -123,8 +123,18 @@ .run()?; sh.remove_path("cpp_test_suite")?; sh.remove_path("go_testdata")?; + sh.remove_path("cpp_perf_tests")?; + sh.remove_path("cpp_benchmarks")?; + sh.remove_path("go_builtin_benchmarks")?; cmd!(sh, "mv {git_dir_path}/jsonnet/test_suite cpp_test_suite").run()?; cmd!(sh, "mv {git_dir_path}/go-jsonnet/testdata go_testdata").run()?; + cmd!(sh, "mv {git_dir_path}/jsonnet/perf_tests cpp_perf_tests").run()?; + cmd!(sh, "mv {git_dir_path}/jsonnet/benchmarks cpp_benchmarks").run()?; + cmd!( + sh, + "mv {git_dir_path}/go-jsonnet/builtin-benchmarks go_builtin_benchmarks" + ) + .run()?; Ok(()) }