diff --git a/Cargo.toml b/Cargo.toml index 90fed9a..fc4e345 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,3 +14,20 @@ edition = "2018" [dependencies] lazy_static = "1" regex = "1" + +[dev-dependencies] +criterion = {version="0.3", features=["html_reports"]} + +[[bench]] +name = "benchmark" +harness = false + +[profile.bench] +opt-level = 3 +lto = "fat" +codegen-units = 1 + +[profile.release] +opt-level = 3 +lto = "fat" +codegen-units = 1 \ No newline at end of file diff --git a/benches/benchmark.rs b/benches/benchmark.rs new file mode 100644 index 0000000..228efee --- /dev/null +++ b/benches/benchmark.rs @@ -0,0 +1,21 @@ +use criterion::{criterion_group, criterion_main, Criterion, BenchmarkId, Throughput, black_box}; + +extern crate magnet_url; +use magnet_url::Magnet; + +fn criterion_benchmark(c: &mut Criterion) { + let magnet = black_box("magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fsintel.torrent"); + let mut group = c.benchmark_group("sintel"); + + group.throughput(Throughput::Elements(1)); + + group.bench_with_input(BenchmarkId::new("sintel", magnet), &magnet, |b, &s| { + b.iter(|| Magnet::new(s)); + }); + + group.finish(); + +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index c91e570..a70bbbe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -97,6 +97,7 @@ const MANIFEST_TOPIC_RE_STR: &str = r"mt=((\w+)[A-Za-z0-9!@#$%^:*<>,?/()_+=.{}\\ /// use magnet_url::Magnet; /// let _magnet_link = Magnet::new("https://example.com"); /// ``` + pub struct Magnet { ///Display Name of the torrent pub dn: String, @@ -169,16 +170,22 @@ impl Magnet { dn: validate_regex(&DISPLAY_NAME_RE, 1), hash_type: validate_regex(&EXACT_TOPIC_RE, 1), xt: validate_regex(&EXACT_TOPIC_RE, 2), - xl: validate_regex(&EXACT_LENGTH_RE, 1).parse().unwrap_or(-1), + // Using a slightly modified match statement so it doesn't parse from str to String to int + xl: { + match &EXACT_LENGTH_RE.captures(magnet_str) { + Some(m) => m.get(1).map_or("-1", |m| m.as_str()).parse().unwrap_or(-1), + None => -1, + } + + }, xs: validate_regex(&EXACT_SOURCE_RE, 1), tr: { let mut tr_vec: Vec = Vec::new(); // Since tr is a vector, I can't just use the validate_regex function - if ADDRESS_TRACKER_RE.is_match(magnet_str) { - for tr in ADDRESS_TRACKER_RE.captures_iter(magnet_str) { - tr_vec.push(tr.get(1).map_or("", |m| m.as_str()).to_string()); - } + for tr in ADDRESS_TRACKER_RE.captures_iter(magnet_str) { + tr_vec.push(tr.get(1).map_or("", |m| m.as_str()).to_string()); } + tr_vec },