use criterion::criterion_group; use criterion::criterion_main; use criterion::Criterion; use futures::stream::StreamExt; use l10nregistry::source::ResourceId; use l10nregistry::testing::{FileSource, RegistrySetup, TestFileFetcher}; use unic_langid::LanguageIdentifier; fn get_paths() -> Vec { let paths: Vec<&'static str> = vec![ "branding/brand.ftl", "browser/sanitize.ftl", "browser/preferences/blocklists.ftl", "browser/preferences/colors.ftl", "browser/preferences/selectBookmark.ftl", "browser/preferences/connection.ftl", "browser/preferences/addEngine.ftl", "browser/preferences/siteDataSettings.ftl", "browser/preferences/fonts.ftl", "browser/preferences/languages.ftl", "browser/preferences/preferences.ftl", "security/certificates/certManager.ftl", "security/certificates/deviceManager.ftl", "toolkit/global/textActions.ftl", "toolkit/printing/printUI.ftl", "toolkit/updates/history.ftl", "toolkit/featuregates/features.ftl", ]; paths.into_iter().map(ResourceId::from).collect() } fn registry_bench(c: &mut Criterion) { let en_us: LanguageIdentifier = "en-US".parse().unwrap(); let mut group = c.benchmark_group("non-metasource"); let setup = RegistrySetup::new( "test", vec![ FileSource::new("toolkit", None, vec![en_us.clone()], "toolkit/{locale}/"), FileSource::new("browser", None, vec![en_us.clone()], "browser/{locale}/"), FileSource::new("toolkit", None, vec![en_us.clone()], "toolkit/{locale}/"), FileSource::new("browser", None, vec![en_us.clone()], "browser/{locale}/"), ], vec![en_us.clone()], ); let fetcher = TestFileFetcher::new(); let (_, reg) = fetcher.get_registry_and_environment(setup); group.bench_function(&format!("serial",), |b| { b.iter(|| { let lang_ids = vec![en_us.clone()]; let mut i = reg.generate_bundles_sync(lang_ids.into_iter(), get_paths()); while let Some(_) = i.next() {} }) }); let rt = tokio::runtime::Runtime::new().unwrap(); group.bench_function(&format!("parallel",), |b| { b.iter(|| { let lang_ids = vec![en_us.clone()]; let mut i = reg.generate_bundles(lang_ids.into_iter(), get_paths()); rt.block_on(async { while let Some(_) = i.next().await {} }); }) }); group.finish(); } fn registry_metasource_bench(c: &mut Criterion) { let en_us: LanguageIdentifier = "en-US".parse().unwrap(); let mut group = c.benchmark_group("metasource"); let setup = RegistrySetup::new( "test", vec![ FileSource::new( "toolkit", Some("app"), vec![en_us.clone()], "toolkit/{locale}/", ), FileSource::new( "browser", Some("app"), vec![en_us.clone()], "browser/{locale}/", ), FileSource::new( "toolkit", Some("langpack"), vec![en_us.clone()], "toolkit/{locale}/", ), FileSource::new( "browser", Some("langpack"), vec![en_us.clone()], "browser/{locale}/", ), ], vec![en_us.clone()], ); let fetcher = TestFileFetcher::new(); let (_, reg) = fetcher.get_registry_and_environment(setup); group.bench_function(&format!("serial",), |b| { b.iter(|| { let lang_ids = vec![en_us.clone()]; let mut i = reg.generate_bundles_sync(lang_ids.into_iter(), get_paths()); while let Some(_) = i.next() {} }) }); let rt = tokio::runtime::Runtime::new().unwrap(); group.bench_function(&format!("parallel",), |b| { b.iter(|| { let lang_ids = vec![en_us.clone()]; let mut i = reg.generate_bundles(lang_ids.into_iter(), get_paths()); rt.block_on(async { while let Some(_) = i.next().await {} }); }) }); group.finish(); } criterion_group!( name = benches; config = Criterion::default().sample_size(10); targets = registry_bench, registry_metasource_bench ); criterion_main!(benches);