From d7f4ef5a074406c8e953f9c12914d0beb7ff56c7 Mon Sep 17 00:00:00 2001 From: gongzhengyang Date: Wed, 24 Sep 2025 10:06:30 +0800 Subject: [PATCH] Feat: limit bench IPv6 range --- binding/rust/ip2region/benches/search.rs | 51 ++++++++++++++++++------ binding/rust/ip2region/src/searcher.rs | 11 +++-- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/binding/rust/ip2region/benches/search.rs b/binding/rust/ip2region/benches/search.rs index 3201f29..321ff8d 100644 --- a/binding/rust/ip2region/benches/search.rs +++ b/binding/rust/ip2region/benches/search.rs @@ -1,49 +1,76 @@ +use std::net::Ipv6Addr; +use std::ops::Range; +use std::str::FromStr; + use criterion::{Criterion, criterion_group, criterion_main}; -use rand; use ip2region::{CachePolicy, Searcher}; macro_rules! bench_search { - ($name:ident, $xdb:expr, $cache_policy:expr, $ty:ty) => { + ($name:ident, $xdb:expr, $cache_policy:expr, $range:ident) => { fn $name(c: &mut Criterion) { + let searcher = Searcher::new($xdb.to_owned(), $cache_policy).unwrap(); + let range = $range(); + c.bench_function(stringify!($name), |b| { - let searcher = Searcher::new($xdb.to_owned(), $cache_policy).unwrap(); b.iter(|| { - searcher.search(rand::random::<$ty>()).unwrap(); + searcher.search(rand::random_range(range.clone())).unwrap(); }) }); } }; } -const IPV4_XDB: &'static str = "../../../data/ip2region_v4.xdb"; -const IPV6_XDB: &'static str = "../../../data/ip2region_v6.xdb"; +fn ipv4_range() -> Range { + 0..((1_u64 << 32) - 1) as u32 +} -bench_search!(ipv4_no_memory_bench, IPV4_XDB, CachePolicy::NoCache, u32); +/// The range of IPv6 is too large, and the value range needs to be limited to +/// make the benchmark test results closer to the production environment +fn ipv6_range() -> Range { + let start = u128::from(Ipv6Addr::from_str("2000::").unwrap()); + let end = u128::from(Ipv6Addr::from_str("2004::").unwrap()); + start..end +} + +const IPV4_XDB: &str = "../../../data/ip2region_v4.xdb"; +const IPV6_XDB: &str = "../../../data/ip2region_v6.xdb"; + +bench_search!( + ipv4_no_memory_bench, + IPV4_XDB, + CachePolicy::NoCache, + ipv4_range +); bench_search!( ipv4_vector_index_cache_bench, IPV4_XDB, CachePolicy::VectorIndex, - u32 + ipv4_range ); bench_search!( ipv4_full_memory_cache_bench, IPV4_XDB, CachePolicy::FullMemory, - u32 + ipv4_range +); +bench_search!( + ipv6_no_memory_bench, + IPV6_XDB, + CachePolicy::NoCache, + ipv6_range ); -bench_search!(ipv6_no_memory_bench, IPV6_XDB, CachePolicy::NoCache, u128); bench_search!( ipv6_vector_index_cache_bench, IPV6_XDB, CachePolicy::VectorIndex, - u128 + ipv6_range ); bench_search!( ipv6_full_memory_cache_bench, IPV6_XDB, CachePolicy::FullMemory, - u128 + ipv6_range ); criterion_group!( diff --git a/binding/rust/ip2region/src/searcher.rs b/binding/rust/ip2region/src/searcher.rs index b23f0ad..4694917 100644 --- a/binding/rust/ip2region/src/searcher.rs +++ b/binding/rust/ip2region/src/searcher.rs @@ -86,10 +86,13 @@ impl Searcher { } else if ip.ip_gt(Cow::Borrowed(&buffer_ip_value[ip_bytes_len..ip_end_offset])) { left = mid + 1; } else { - let data_length = - u16::from_le_bytes([buffer_ip_value[ip_end_offset], buffer_ip_value[ip_end_offset + 1]]); - let data_offset = - u32::from_le_bytes(buffer_ip_value[ip_end_offset + 2..ip_end_offset + 6].try_into()?); + let data_length = u16::from_le_bytes([ + buffer_ip_value[ip_end_offset], + buffer_ip_value[ip_end_offset + 1], + ]); + let data_offset = u32::from_le_bytes( + buffer_ip_value[ip_end_offset + 2..ip_end_offset + 6].try_into()?, + ); let result = String::from_utf8( self.read_buf(data_offset as usize, data_length as usize)? .to_vec(),