Feat: limit bench IPv6 range

This commit is contained in:
gongzhengyang 2025-09-24 10:06:30 +08:00 committed by 龚正阳
parent 7a4bd4ed2b
commit d7f4ef5a07
2 changed files with 46 additions and 16 deletions

View File

@ -1,49 +1,76 @@
use std::net::Ipv6Addr;
use std::ops::Range;
use std::str::FromStr;
use criterion::{Criterion, criterion_group, criterion_main}; use criterion::{Criterion, criterion_group, criterion_main};
use rand;
use ip2region::{CachePolicy, Searcher}; use ip2region::{CachePolicy, Searcher};
macro_rules! bench_search { 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) { fn $name(c: &mut Criterion) {
c.bench_function(stringify!($name), |b| {
let searcher = Searcher::new($xdb.to_owned(), $cache_policy).unwrap(); let searcher = Searcher::new($xdb.to_owned(), $cache_policy).unwrap();
let range = $range();
c.bench_function(stringify!($name), |b| {
b.iter(|| { 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"; fn ipv4_range() -> Range<u32> {
const IPV6_XDB: &'static str = "../../../data/ip2region_v6.xdb"; 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<u128> {
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!( bench_search!(
ipv4_vector_index_cache_bench, ipv4_vector_index_cache_bench,
IPV4_XDB, IPV4_XDB,
CachePolicy::VectorIndex, CachePolicy::VectorIndex,
u32 ipv4_range
); );
bench_search!( bench_search!(
ipv4_full_memory_cache_bench, ipv4_full_memory_cache_bench,
IPV4_XDB, IPV4_XDB,
CachePolicy::FullMemory, 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!( bench_search!(
ipv6_vector_index_cache_bench, ipv6_vector_index_cache_bench,
IPV6_XDB, IPV6_XDB,
CachePolicy::VectorIndex, CachePolicy::VectorIndex,
u128 ipv6_range
); );
bench_search!( bench_search!(
ipv6_full_memory_cache_bench, ipv6_full_memory_cache_bench,
IPV6_XDB, IPV6_XDB,
CachePolicy::FullMemory, CachePolicy::FullMemory,
u128 ipv6_range
); );
criterion_group!( criterion_group!(

View File

@ -86,10 +86,13 @@ impl Searcher {
} else if ip.ip_gt(Cow::Borrowed(&buffer_ip_value[ip_bytes_len..ip_end_offset])) { } else if ip.ip_gt(Cow::Borrowed(&buffer_ip_value[ip_bytes_len..ip_end_offset])) {
left = mid + 1; left = mid + 1;
} else { } else {
let data_length = let data_length = u16::from_le_bytes([
u16::from_le_bytes([buffer_ip_value[ip_end_offset], buffer_ip_value[ip_end_offset + 1]]); buffer_ip_value[ip_end_offset],
let data_offset = buffer_ip_value[ip_end_offset + 1],
u32::from_le_bytes(buffer_ip_value[ip_end_offset + 2..ip_end_offset + 6].try_into()?); ]);
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( let result = String::from_utf8(
self.read_buf(data_offset as usize, data_length as usize)? self.read_buf(data_offset as usize, data_length as usize)?
.to_vec(), .to_vec(),