mirror of
https://github.com/achanda/ipnetwork.git
synced 2025-06-16 08:48:51 +00:00
Add a benchmark for CIDR parsing
Also optimise the cidr_parts implementation
This commit is contained in:
@ -17,6 +17,7 @@ serde = ">=0.8.0, <2.0"
|
|||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
serde_derive = ">=0.8.0, <2.0"
|
serde_derive = ">=0.8.0, <2.0"
|
||||||
|
criterion = "0.2.9"
|
||||||
|
|
||||||
[badges]
|
[badges]
|
||||||
travis-ci = { repository = "achanda/ipnetwork" }
|
travis-ci = { repository = "achanda/ipnetwork" }
|
||||||
@ -24,3 +25,7 @@ travis-ci = { repository = "achanda/ipnetwork" }
|
|||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
dev = ["clippy"]
|
dev = ["clippy"]
|
||||||
|
|
||||||
|
[[bench]]
|
||||||
|
name = "parse_bench"
|
||||||
|
harness = false
|
||||||
|
21
benches/parse_bench.rs
Normal file
21
benches/parse_bench.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate criterion;
|
||||||
|
extern crate ipnetwork;
|
||||||
|
|
||||||
|
use ipnetwork::{Ipv4Network, Ipv6Network};
|
||||||
|
use criterion::Criterion;
|
||||||
|
|
||||||
|
fn parse_ipv4_benchmark(c: &mut Criterion) {
|
||||||
|
c.bench_function("parse ipv4", |b| b.iter(|| {
|
||||||
|
"127.1.0.0/24".parse::<Ipv4Network>().unwrap()
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_ipv6_benchmark(c: &mut Criterion) {
|
||||||
|
c.bench_function("parse ipv6", |b| b.iter(|| {
|
||||||
|
"FF01:0:0:17:0:0:0:2/64".parse::<Ipv6Network>().unwrap()
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
criterion_group!(benches, parse_ipv4_benchmark, parse_ipv6_benchmark);
|
||||||
|
criterion_main!(benches);
|
@ -32,16 +32,23 @@ impl Error for IpNetworkError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn cidr_parts(cidr: &str) -> Result<(&str, Option<&str>), IpNetworkError> {
|
pub fn cidr_parts(cidr: &str) -> Result<(&str, Option<&str>), IpNetworkError> {
|
||||||
let parts = cidr.split('/').collect::<Vec<&str>>();
|
// Try to find a single slash
|
||||||
if parts.len() == 1 {
|
if let Some(sep) = cidr.find('/') {
|
||||||
Ok((parts[0], None))
|
let (ip, prefix) = cidr.split_at(sep);
|
||||||
} else if parts.len() == 2 {
|
// Error if cidr has multiple slashes
|
||||||
Ok((parts[0], Some(parts[1])))
|
if prefix[1..].find('/').is_some() {
|
||||||
} else {
|
return Err(IpNetworkError::InvalidCidrFormat(format!(
|
||||||
Err(IpNetworkError::InvalidCidrFormat(format!(
|
|
||||||
"CIDR must contain a single '/': {}",
|
"CIDR must contain a single '/': {}",
|
||||||
cidr
|
cidr
|
||||||
)))
|
)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Handle the case when cidr has exactly one slash
|
||||||
|
return Ok((ip, Some(&prefix[1..])));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Handle the case when cidr does not have a slash
|
||||||
|
return Ok((cidr, None));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user