Files
libphonenumber/benches/format_bench.rs
2025-07-13 21:16:14 +03:00

77 lines
2.3 KiB
Rust

use criterion::{Criterion, black_box, criterion_group, criterion_main};
use rlibphonenumber::{PhoneNumberFormat, PHONE_NUMBER_UTIL};
use phonenumber::{
self as rlp,
country::Id::{self, AU}, Mode,
};
type TestEntity = (&'static str, &'static str, Id);
fn setup_numbers() -> Vec<TestEntity> {
vec![("0011 54 9 11 8765 4321 ext. 1234", "AU", AU)]
}
fn convert_to_rlp_numbers(numbers: &[TestEntity]) -> Vec<rlp::PhoneNumber> {
numbers
.iter()
.map(|s| rlp::parse(Some(s.2), s.0).unwrap())
.collect()
}
fn convert_to_rlibphonenumber_numbers(
numbers: &[TestEntity],
) -> Vec<rlibphonenumber::PhoneNumber> {
numbers
.iter()
.map(|s| PHONE_NUMBER_UTIL.parse(s.0, s.1).unwrap())
.collect()
}
fn formatting_benchmark(c: &mut Criterion) {
let numbers = setup_numbers();
let rlp_numbers = convert_to_rlp_numbers(&numbers);
let numbers = convert_to_rlibphonenumber_numbers(&numbers);
let mut group = c.benchmark_group("Formatting Comparison");
let mut test = |format_a: PhoneNumberFormat, format_b: Mode| {
group.bench_function(format!("rlibphonenumber: format({:?})", format_a), |b| {
b.iter(|| {
for number in &numbers {
PHONE_NUMBER_UTIL
.format(black_box(number), black_box(format_a))
.unwrap();
}
})
});
group.bench_function(format!("rust-phonenumber: format({:?})", format_b), |b| {
b.iter(|| {
for number in &rlp_numbers {
rlp::format(black_box(number)).mode(format_b).to_string();
}
})
});
for (number_a, number_b) in rlp_numbers.iter().zip(numbers.iter()) {
assert_eq!(
rlp::format(number_a).mode(format_b).to_string(),
PHONE_NUMBER_UTIL
.format(number_b, format_a)
.unwrap()
);
}
};
test(PhoneNumberFormat::E164, Mode::E164);
test(PhoneNumberFormat::International, Mode::International);
test(PhoneNumberFormat::National, Mode::National);
test(PhoneNumberFormat::RFC3966, Mode::Rfc3966);
group.finish();
}
criterion_group!(benches, formatting_benchmark);
criterion_main!(benches);