diff options
Diffstat (limited to 'third_party/rust/fluent-syntax/benches/parser.rs')
-rw-r--r-- | third_party/rust/fluent-syntax/benches/parser.rs | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/third_party/rust/fluent-syntax/benches/parser.rs b/third_party/rust/fluent-syntax/benches/parser.rs new file mode 100644 index 0000000000..f14725a512 --- /dev/null +++ b/third_party/rust/fluent-syntax/benches/parser.rs @@ -0,0 +1,141 @@ +use criterion::criterion_group; +use criterion::criterion_main; +use criterion::Criterion; +use std::collections::HashMap; +use std::fs; +use std::io; + +use fluent_syntax::parser::parse_runtime; + +fn read_file(path: &str) -> Result<String, io::Error> { + fs::read_to_string(path) +} + +#[cfg(feature = "all-benchmarks")] +fn get_resources(tests: &[&'static str]) -> HashMap<&'static str, String> { + let mut ftl_strings = HashMap::new(); + for test in tests { + let path = format!("./benches/{}", test); + ftl_strings.insert(*test, read_file(&path).expect("Couldn't load file")); + } + return ftl_strings; +} + +fn get_ctxs(tests: &[&'static str]) -> HashMap<&'static str, Vec<String>> { + let mut ftl_strings = HashMap::new(); + for test in tests { + let paths = fs::read_dir(format!("./benches/contexts/{}", test)).unwrap(); + let strings = paths + .into_iter() + .map(|p| { + let p = p.unwrap().path(); + let path = p.to_str().unwrap(); + read_file(path).unwrap() + }) + .collect::<Vec<_>>(); + ftl_strings.insert(*test, strings); + } + return ftl_strings; +} + +fn parse_bench(c: &mut Criterion) { + #[cfg(feature = "all-benchmarks")] + { + let tests = &["simple.ftl", "preferences.ftl", "menubar.ftl"]; + + let mut group = c.benchmark_group("parse_resource"); + + for (name, resource) in get_resources(tests) { + group.bench_with_input(name, &resource, |b, source| { + b.iter(|| parse_runtime(source.as_str()).expect("Parsing of the FTL failed.")) + }); + } + + group.finish(); + } + + let ctx_names = &["browser", "preferences"]; + + #[cfg(feature = "all-benchmarks")] + { + use fluent_syntax::parser::parse; + + let mut group = c.benchmark_group("parse_ctx"); + + for (name, ctx) in get_ctxs(ctx_names) { + group.bench_with_input(name, &ctx, |b, ctx| { + b.iter(|| { + for source in ctx { + parse(source.as_str()).expect("Parsing of the FTL failed."); + } + }) + }); + } + + group.finish(); + } + + { + let mut group = c.benchmark_group("parse_ctx_runtime"); + + for (name, ctx) in get_ctxs(ctx_names) { + group.bench_with_input(name, &ctx, |b, ctx| { + b.iter(|| { + for source in ctx { + parse_runtime(source.as_str()).expect("Parsing of the FTL failed."); + } + }) + }); + } + + group.finish(); + } + + #[cfg(feature = "all-benchmarks")] + { + use fluent_syntax::unicode::{unescape_unicode, unescape_unicode_to_string}; + + let strings = &[ + "foo", + "This is an example value", + "Hello \\u00e3\\u00e9 World", + "\\u004c\\u006f\\u0072\\u0065\\u006d \\u0069\\u0070\\u0073\\u0075\\u006d \\u0064\\u006f\\u006c\\u006f\\u0072 \\u0073\\u0069\\u0074 \\u0061\\u006d\\u0065\\u0074", + "Let me introduce \\\"The\\\" Fluent", + "And here's an example of \\\\ a character to be escaped", + "But this message is completely unescape free", + "And so is this one", + "Maybe this one is as well completely escape free", + "Welcome to Mozilla Firefox", + "\\u0054\\u0068\\u0065\\u0073\\u0065 \\u0073\\u0065\\u0074\\u0074\\u0069\\u006e\\u0067\\u0073 \\u0061\\u0072\\u0065 \\u0074\\u0061\\u0069\\u006c\\u006f\\u0072\\u0065\\u0064 \\u0074\\u006f \\u0079\\u006f\\u0075\\u0072 \\u0063\\u006f\\u006d\\u0070\\u0075\\u0074\\u0065\\u0072\\u2019\\u0073 \\u0068\\u0061\\u0072\\u0064\\u0077\\u0061\\u0072\\u0065 \\u0061\\u006e\\u0064 \\u006f\\u0070\\u0065\\u0072\\u0061\\u0074\\u0069\\u006e\\u0067 \\u0073\\u0079\\u0073\\u0074\\u0065\\u006d\\u002e", + "These settings are tailored to your computer’s hardware and operating system", + "Use recommended performance settings", + "\\u0041\\u0064\\u0064\\u0069\\u0074\\u0069\\u006f\\u006e\\u0061\\u006c \\u0063\\u006f\\u006e\\u0074\\u0065\\u006e\\u0074 \\u0070\\u0072\\u006f\\u0063\\u0065\\u0073\\u0073\\u0065\\u0073 \\u0063\\u0061\\u006e \\u0069\\u006d\\u0070\\u0072\\u006f\\u0076\\u0065 \\u0070\\u0065\\u0072\\u0066\\u006f\\u0072\\u006d\\u0061\\u006e\\u0063\\u0065 \\u0077\\u0068\\u0065\\u006e \\u0075\\u0073\\u0069\\u006e\\u0067 \\u006d\\u0075\\u006c\\u0074\\u0069\\u0070\\u006c\\u0065 \\u0074\\u0061\\u0062\\u0073\\u002c \\u0062\\u0075\\u0074 \\u0077\\u0069\\u006c\\u006c \\u0061\\u006c\\u0073\\u006f \\u0075\\u0073\\u0065 \\u006d\\u006f\\u0072\\u0065 \\u006d\\u0065\\u006d\\u006f\\u0072\\u0079\\u002e", + "Additional content processes can improve performance when using multiple tabs, but will also use more memory.", + ]; + + let mut group = c.benchmark_group("unicode"); + + group.bench_function("writer", |b| { + b.iter(|| { + let mut result = String::new(); + for s in strings { + unescape_unicode(&mut result, s).unwrap(); + result.clear(); + } + }) + }); + + group.bench_function("to_string", |b| { + b.iter(|| { + for s in strings { + let _ = unescape_unicode_to_string(s); + } + }) + }); + + group.finish(); + } +} + +criterion_group!(benches, parse_bench,); +criterion_main!(benches); |