mirror of
https://github.com/lionsoul2014/ip2region.git
synced 2025-12-08 19:25:22 +00:00
Feat: limit bench IPv6 range
This commit is contained in:
parent
7a4bd4ed2b
commit
d7f4ef5a07
@ -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<u32> {
|
||||
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!(
|
||||
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!(
|
||||
|
||||
@ -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(),
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user