Files
learn_save/benches/validate_id.rs
T
2026-08-11 11:52:28 +03:00

78 lines
2.5 KiB
Rust

use std::hint::black_box;
use criterion::{criterion_group, criterion_main, Criterion};
fn validate_id_current(id: &str) -> bool {
id.len() == 24 && id.chars().all(|c| c.is_ascii_alphanumeric())
}
fn validate_id_improved(id: &str) -> bool {
id.len() == 24 && id.bytes().all(|b| b.is_ascii_alphanumeric())
}
fn validate_id_strict(id: &str) -> bool {
id.len() == 24
&& id
.bytes()
.all(|b| matches!(b, b'A'..=b'Z' | b'0'..=b'9'))
}
fn sanity_checks() {
let valid_upper = "A1B2C3D4E5F6G7H8I9J0K1L2";
let valid_lower = "a1b2c3d4e5f6g7h8i9j0k1l2";
let invalid_symbol = "A1B2C3D4E5F6G7H8I9J0K1L_";
let invalid_len_23 = "A1B2C3D4E5F6G7H8I9J0K1L";
let invalid_len_25 = "A1B2C3D4E5F6G7H8I9J0K1L2M";
assert_eq!(valid_upper.len(), 24);
assert_eq!(valid_lower.len(), 24);
assert_eq!(invalid_symbol.len(), 24);
assert_eq!(invalid_len_23.len(), 23);
assert_eq!(invalid_len_25.len(), 25);
// Текущая версия
assert!(validate_id_current(valid_upper));
assert!(validate_id_current(valid_lower));
assert!(!validate_id_current(invalid_symbol));
assert!(!validate_id_current(invalid_len_23));
assert!(!validate_id_current(invalid_len_25));
// Улучшенная версия должна вести себя так же
assert!(validate_id_improved(valid_upper));
assert!(validate_id_improved(valid_lower));
assert!(!validate_id_improved(invalid_symbol));
assert!(!validate_id_improved(invalid_len_23));
assert!(!validate_id_improved(invalid_len_25));
}
fn bench_validate_id(c: &mut Criterion) {
sanity_checks();
let cases = [
("valid_upper", "A1B2C3D4E5F6G7H8I9J0K1L2"),
("valid_lower", "a1b2c3d4e5f6g7h8i9j0k1l2"),
("invalid_symbol", "A1B2C3D4E5F6G7H8I9J0K1L_"),
("invalid_len_23", "A1B2C3D4E5F6G7H8I9J0K1L"),
("invalid_len_25", "A1B2C3D4E5F6G7H8I9J0K1L2M"),
];
let mut group = c.benchmark_group("validate_id");
for (name, input) in cases {
group.bench_function(format!("current/{name}"), |b| {
b.iter(|| validate_id_current(black_box(input)))
});
group.bench_function(format!("improved/{name}"), |b| {
b.iter(|| validate_id_improved(black_box(input)))
});
group.bench_function(format!("strict/{name}"), |b| {
b.iter(|| validate_id_strict(black_box(input)))
});
}
group.finish();
}
criterion_group!(benches, bench_validate_id);
criterion_main!(benches);