From f31f94e3ce5141461b6d65973e702aca822ad25d Mon Sep 17 00:00:00 2001 From: Dominik Nakamura Date: Mon, 23 Oct 2023 17:26:06 +0900 Subject: [PATCH] refactor: create benchmarks for the compiler --- crates/stef-benches/Cargo.toml | 5 ++ crates/stef-benches/benches/compiler.rs | 17 +++++ crates/stef-benches/benches/parser.rs | 94 +------------------------ crates/stef-benches/src/lib.rs | 90 +++++++++++++++++++++++ 4 files changed, 114 insertions(+), 92 deletions(-) create mode 100644 crates/stef-benches/benches/compiler.rs diff --git a/crates/stef-benches/Cargo.toml b/crates/stef-benches/Cargo.toml index 3df3a20..47bf64f 100644 --- a/crates/stef-benches/Cargo.toml +++ b/crates/stef-benches/Cargo.toml @@ -10,6 +10,10 @@ repository.workspace = true license.workspace = true publish = false +[[bench]] +name = "compiler" +harness = false + [[bench]] name = "parser" harness = false @@ -20,6 +24,7 @@ harness = false [dependencies] mimalloc.workspace = true +stef-compiler = { path = "../stef-compiler" } stef-parser = { path = "../stef-parser" } [dev-dependencies] diff --git a/crates/stef-benches/benches/compiler.rs b/crates/stef-benches/benches/compiler.rs new file mode 100644 index 0000000..bf4ff45 --- /dev/null +++ b/crates/stef-benches/benches/compiler.rs @@ -0,0 +1,17 @@ +use divan::{black_box, Bencher}; + +#[global_allocator] +static ALLOC: mimalloc::MiMalloc = mimalloc::MiMalloc; + +fn main() { + divan::main(); +} + +#[divan::bench(consts = [1, 10, 100, 1000])] +fn large_schema(bencher: Bencher) { + let schema = stef_benches::generate_schema(N); + let schema = stef_parser::Schema::parse(&schema).unwrap(); + stef_compiler::validate_schema(&schema).unwrap(); + + bencher.bench(|| stef_compiler::validate_schema(black_box(&schema))) +} diff --git a/crates/stef-benches/benches/parser.rs b/crates/stef-benches/benches/parser.rs index 6569cac..732a96d 100644 --- a/crates/stef-benches/benches/parser.rs +++ b/crates/stef-benches/benches/parser.rs @@ -1,5 +1,3 @@ -use std::fmt::Write; - use divan::{black_box, Bencher}; use indoc::indoc; @@ -50,7 +48,7 @@ fn basic(bencher: Bencher) { #[divan::bench(consts = [1, 10, 100, 1000])] fn large_schema(bencher: Bencher) { - let schema = generate_schema(N); + let schema = stef_benches::generate_schema(N); stef_parser::Schema::parse(&schema).unwrap(); bencher.bench(|| stef_parser::Schema::parse(black_box(&schema))) @@ -58,96 +56,8 @@ fn large_schema(bencher: Bencher) { #[divan::bench(consts = [1, 10, 100, 1000])] fn print(bencher: Bencher) { - let schema = generate_schema(N); + let schema = stef_benches::generate_schema(N); let schema = stef_parser::Schema::parse(&schema).unwrap(); bencher.bench(|| black_box(&schema).to_string()) } - -fn generate_schema(count: usize) -> String { - let mut input = String::new(); - - for i in 1..=count { - writeln!(&mut input, "use some::other::module{i};").unwrap(); - } - - input.push('\n'); - - for i in 1..=count { - writeln!( - &mut input, - "const VALUE_BOOL_{i}: bool = {};", - if i % 2 == 0 { "true" } else { "false" } - ) - .unwrap(); - writeln!(&mut input, "const VALUE_INT_{i}: u32 = {i};").unwrap(); - writeln!( - &mut input, - "const VALUE_FLOAT_{i}: f64 = {};", - i as f64 / 19.0 - ) - .unwrap(); - writeln!(&mut input, "const VALUE_STR_{i}: &string = \"{i}\";").unwrap(); - writeln!(&mut input, "const VALUE_BYTES_{i}: &bytes = [{}];", i % 256).unwrap(); - } - - input.push('\n'); - - for i in 1..=count { - writeln!(&mut input, "/// Some comment {i}").unwrap(); - } - - for i in 1..=count { - writeln!(&mut input, "#[unit_attribute_{i}]").unwrap(); - writeln!(&mut input, "#[single_value_{i} = \"value_{i}\"]").unwrap(); - writeln!( - &mut input, - "#[multi_value_{i}(value_a = true, value_b(test1, test2), value_c)]" - ) - .unwrap(); - } - - input.push_str("struct SampleNamed {\n"); - for i in 1..=count { - writeln!(&mut input, " field_str_{i:05}: string @{i},").unwrap(); - writeln!( - &mut input, - " field_gen_{i:05}: vec)>> @{},", - i + count - ) - .unwrap(); - } - input.push_str("}\n"); - - input.push_str("\nstruct SampleUnnamed("); - for i in 1..=count { - write!(&mut input, "string @{i},").unwrap(); - write!( - &mut input, - "vec)>> @{},", - i + count - ) - .unwrap(); - } - input.push_str(")\n"); - - input.push_str("\nenum SampleEnum {\n"); - for i in 1..=count { - writeln!(&mut input, " VariantNamed{i} {{").unwrap(); - writeln!(&mut input, " field_str: string @1,").unwrap(); - writeln!(&mut input, " field_gen: vec> @2,").unwrap(); - writeln!(&mut input, " }} @{i},").unwrap(); - write!(&mut input, " VariantUnnamed{i}(").unwrap(); - write!(&mut input, "string @1, vec> @2").unwrap(); - writeln!(&mut input, ") @{},", i + count).unwrap(); - } - input.push_str("}\n"); - - input.push('\n'); - - for i in 1..=count { - writeln!(&mut input, "type Alias{i} = SampleNamed;").unwrap(); - } - - input -} diff --git a/crates/stef-benches/src/lib.rs b/crates/stef-benches/src/lib.rs index 9da70d8..ee2317c 100644 --- a/crates/stef-benches/src/lib.rs +++ b/crates/stef-benches/src/lib.rs @@ -1 +1,91 @@ +use std::fmt::Write; + pub mod varint; + +pub fn generate_schema(count: usize) -> String { + let mut input = String::new(); + + for i in 1..=count { + writeln!(&mut input, "use some::other::module{i};").unwrap(); + } + + input.push('\n'); + + for i in 1..=count { + writeln!( + &mut input, + "const VALUE_BOOL_{i}: bool = {};", + if i % 2 == 0 { "true" } else { "false" } + ) + .unwrap(); + writeln!(&mut input, "const VALUE_INT_{i}: u32 = {i};").unwrap(); + writeln!( + &mut input, + "const VALUE_FLOAT_{i}: f64 = {};", + i as f64 / 19.0 + ) + .unwrap(); + writeln!(&mut input, "const VALUE_STR_{i}: &string = \"{i}\";").unwrap(); + writeln!(&mut input, "const VALUE_BYTES_{i}: &bytes = [{}];", i % 256).unwrap(); + } + + input.push('\n'); + + for i in 1..=count { + writeln!(&mut input, "/// Some comment {i}").unwrap(); + } + + for i in 1..=count { + writeln!(&mut input, "#[unit_attribute_{i}]").unwrap(); + writeln!(&mut input, "#[single_value_{i} = \"value_{i}\"]").unwrap(); + writeln!( + &mut input, + "#[multi_value_{i}(value_a = true, value_b(test1, test2), value_c)]" + ) + .unwrap(); + } + + input.push_str("struct SampleNamed {\n"); + for i in 1..=count { + writeln!(&mut input, " field_str_{i:05}: string @{i},").unwrap(); + writeln!( + &mut input, + " field_gen_{i:05}: vec)>> @{},", + i + count + ) + .unwrap(); + } + input.push_str("}\n"); + + input.push_str("\nstruct SampleUnnamed("); + for i in 1..=count { + write!(&mut input, "string @{i},").unwrap(); + write!( + &mut input, + "vec)>> @{},", + i + count + ) + .unwrap(); + } + input.push_str(")\n"); + + input.push_str("\nenum SampleEnum {\n"); + for i in 1..=count { + writeln!(&mut input, " VariantNamed{i} {{").unwrap(); + writeln!(&mut input, " field_str: string @1,").unwrap(); + writeln!(&mut input, " field_gen: vec> @2,").unwrap(); + writeln!(&mut input, " }} @{i},").unwrap(); + write!(&mut input, " VariantUnnamed{i}(").unwrap(); + write!(&mut input, "string @1, vec> @2").unwrap(); + writeln!(&mut input, ") @{},", i + count).unwrap(); + } + input.push_str("}\n"); + + input.push('\n'); + + for i in 1..=count { + writeln!(&mut input, "type Alias{i} = SampleNamed;").unwrap(); + } + + input +}