summaryrefslogtreecommitdiffstats
path: root/third_party/rust/fluent-syntax/benches/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/fluent-syntax/benches/parser.rs')
-rw-r--r--third_party/rust/fluent-syntax/benches/parser.rs141
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);