• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This file is part of ICU4X. For terms of use, please see the file
2 // called LICENSE at the top level of the ICU4X source tree
3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4 
5 use criterion::{black_box, criterion_group, criterion_main, Criterion};
6 use icu_locale::LocaleCanonicalizer;
7 use icu_locale::LocaleExpander;
8 use icu_locale_core::Locale;
9 
canonicalize_bench(c: &mut Criterion)10 fn canonicalize_bench(c: &mut Criterion) {
11     let lc = LocaleCanonicalizer::new_common();
12 
13     let mut group = c.benchmark_group("uncanonicalized");
14 
15     let data: Vec<String> =
16         serde_json::from_str(include_str!("fixtures/uncanonicalized-locales.json"))
17             .expect("Failed to read a fixture");
18     let locales: Vec<Locale> = data.iter().map(|s| s.parse().unwrap()).collect();
19 
20     group.bench_function("clone", |b| {
21         b.iter(|| {
22             for locale in &locales {
23                 let _ = black_box(locale).clone();
24             }
25         })
26     });
27 
28     group.bench_function("canonicalize", |b| {
29         b.iter(|| {
30             for locale in &locales {
31                 let mut locale = black_box(locale).clone();
32                 lc.canonicalize(&mut locale);
33             }
34         })
35     });
36 
37     group.finish();
38 }
39 
canonicalize_noop_bench(c: &mut Criterion)40 fn canonicalize_noop_bench(c: &mut Criterion) {
41     let lc = LocaleCanonicalizer::new_common();
42 
43     let mut group = c.benchmark_group("canonicalized");
44 
45     // None of these locales require canonicalization, so this measures the cost of calling
46     // the canonicalizer on locales that will not be modified.
47     let data: Vec<String> = serde_json::from_str(include_str!("fixtures/locales.json"))
48         .expect("Failed to read a fixture");
49     let locales: Vec<Locale> = data.iter().map(|s| s.parse().unwrap()).collect();
50 
51     group.bench_function("clone", |b| {
52         b.iter(|| {
53             for locale in &locales {
54                 let _ = black_box(locale).clone();
55             }
56         })
57     });
58 
59     group.bench_function("canonicalize", |b| {
60         b.iter(|| {
61             for locale in &locales {
62                 let mut locale = black_box(locale).clone();
63                 lc.canonicalize(&mut locale);
64             }
65         })
66     });
67 
68     group.finish();
69 }
70 
maximize_bench(c: &mut Criterion)71 fn maximize_bench(c: &mut Criterion) {
72     let lc = LocaleExpander::new_common();
73 
74     let mut group = c.benchmark_group("likelysubtags");
75 
76     let data: Vec<String> = serde_json::from_str(include_str!("fixtures/locales.json"))
77         .expect("Failed to read a fixture");
78     let locales: Vec<Locale> = data.iter().map(|s| s.parse().unwrap()).collect();
79 
80     group.bench_function("maximize", |b| {
81         b.iter(|| {
82             for locale in &locales {
83                 let mut locale = locale.clone();
84                 lc.maximize(black_box(&mut locale.id));
85             }
86         })
87     });
88 
89     group.bench_function("minimize", |b| {
90         b.iter(|| {
91             for locale in &locales {
92                 let mut locale = locale.clone();
93                 lc.minimize(black_box(&mut locale.id));
94             }
95         })
96     });
97 
98     group.finish();
99 }
100 
101 criterion_group!(
102     benches,
103     canonicalize_bench,
104     canonicalize_noop_bench,
105     maximize_bench
106 );
107 criterion_main!(benches);
108