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

73 lines
3.6 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// benches/parsing_benchmark.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};
// --- Импорты из вашей библиотеки ---
use rlibphonenumber::PHONE_NUMBER_UTIL;
// --- Импорты из внешней библиотеки ---
use phonenumber::{self as rlp, country::Id};
// Тип для наших тестовых данных: (строкаомера, регион_для_вас, регион_для_rlp)
type TestEntity = (&'static str, &'static str, Id);
/// Подготавливает разнообразный набор данных для тестирования парсинга.
/// Это дает более объективную оценку, чем один номер.
fn setup_parsing_data() -> Vec<TestEntity> {
use phonenumber::country::Id::*;
vec![
// Оригинальный номер из вашего примера
("0011 54 9 11 8765 4321 ext. 1234", "AU", AU),
// Простой номер США в национальном формате
("(650) 253-0000", "US", US),
// Номер Великобритании в международном формате со знаком +
("+44 20 8765 4321", "GB", GB),
// Номер Великобритании с национальным префиксом (ведущий ноль)
("020 8765 4321", "GB", GB),
// Сложный мобильный номер Аргентины
("011 15-1234-5678", "AR", AR),
// Итальянский номер со значащим ведущим нулем
("02 12345678", "IT", IT),
// "Vanity" номер (с буквами)
("1-800-FLOWERS", "US", US),
// Короткий номер, который может быть валидным в некоторых регионах
("12345", "DE", DE),
]
}
fn parsing_benchmark(c: &mut Criterion) {
// Получаем наш набор тестовых данных
let numbers_to_parse = setup_parsing_data();
let mut group = c.benchmark_group("Parsing Comparison");
// --- Бенчмарк для вашей библиотеки rlibphonenumber ---
group.bench_function("rlibphonenumber: parse()", |b| {
// b.iter() запускает код в цикле много раз для замера
b.iter(|| {
// Итерируемся по всем номерам в нашем наборе
for (number_str, region, _) in &numbers_to_parse {
// Вызываем parse, обернув аргументы в black_box.
// Это гарантирует, что компилятор не оптимизирует вызов.
// Мы не используем результат, так как нас интересует только скорость выполнения.
let _ = PHONE_NUMBER_UTIL.parse(black_box(number_str), black_box(region));
}
})
});
// --- Бенчмарк для библиотеки rust-phonenumber ---
group.bench_function("rust-phonenumber: parse()", |b| {
b.iter(|| {
for (number_str, _, region_id) in &numbers_to_parse {
// Аналогичный вызов для второй библиотеки
let _ = rlp::parse(black_box(Some(*region_id)), black_box(number_str));
}
})
});
group.finish();
}
// Макросы для регистрации и запуска бенчмарка
criterion_group!(benches, parsing_benchmark);
criterion_main!(benches);