diff --git a/Cargo.toml b/Cargo.toml index 580f697..39e2beb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,8 +36,5 @@ version-sync = "0.9" criterion = "0.3.1" [[bench]] -name = "parse" +name = "bench_main" harness = false - -[profile.bench] -debug = true diff --git a/benches/bench_main.rs b/benches/bench_main.rs new file mode 100644 index 0000000..f34bdec --- /dev/null +++ b/benches/bench_main.rs @@ -0,0 +1,7 @@ +use criterion::criterion_main; + +mod benchmarks; + +criterion_main! { + benchmarks::media_playlist::benches, +} diff --git a/benches/benchmarks/media_playlist.rs b/benches/benchmarks/media_playlist.rs new file mode 100644 index 0000000..46ad550 --- /dev/null +++ b/benches/benchmarks/media_playlist.rs @@ -0,0 +1,75 @@ +use std::str::FromStr; +use std::time::Duration; + +use criterion::{black_box, criterion_group, Criterion, Throughput}; + +use hls_m3u8::tags::{ExtXDateRange, ExtXProgramDateTime}; +use hls_m3u8::types::Value; +use hls_m3u8::{MediaPlaylist, MediaSegment}; + +fn create_manifest_data() -> Vec { + let mut builder = MediaPlaylist::builder(); + + builder.media_sequence(826176645); + builder.has_independent_segments(true); + builder.target_duration(Duration::from_secs(2)); + + for i in 0..4000 { + let mut seg = MediaSegment::builder(); + seg.duration(Duration::from_secs_f64(1.92)).uri(format!( + "avc_unencrypted_global-video=3000000-{}.ts?variant=italy", + 826176659 + i + )); + + if i == 0 { + seg.program_date_time(ExtXProgramDateTime::new("2020-04-07T11:32:38Z")); + } + + if i % 100 == 0 { + seg.date_range( + ExtXDateRange::builder() + .id(format!("date_id_{}", i / 100)) + .start_date("2020-04-07T11:40:02.040000Z") + .duration(Duration::from_secs_f64(65.2)) + .insert_client_attribute( + "SCTE35-OUT", + Value::Hex( + hex::decode(concat!( + "FC30250000", + "0000000000", + "FFF0140500", + "001C207FEF", + "FE0030E3A0", + "FE005989E0", + "0001000000", + "0070BA5ABF" + )) + .unwrap(), + ), + ) + .build() + .unwrap(), + ); + } + + builder.push_segment(seg.build().unwrap()); + } + + builder.build().unwrap().to_string().into_bytes() +} + +fn criterion_benchmark(c: &mut Criterion) { + let data = String::from_utf8(create_manifest_data()).unwrap(); + + let mut group = c.benchmark_group("MediaPlaylist::from_str"); + + group.throughput(Throughput::Bytes(data.len() as u64)); + + group.bench_function("MediaPlaylist::from_str", |b| { + b.iter(|| MediaPlaylist::from_str(black_box(&data)).unwrap()); + }); + + group.finish(); +} + +criterion_group!(benches, criterion_benchmark); diff --git a/benches/benchmarks/mod.rs b/benches/benchmarks/mod.rs new file mode 100644 index 0000000..85a0187 --- /dev/null +++ b/benches/benchmarks/mod.rs @@ -0,0 +1 @@ +pub mod media_playlist; diff --git a/benches/parse.rs b/benches/parse.rs deleted file mode 100644 index f07dd0b..0000000 --- a/benches/parse.rs +++ /dev/null @@ -1,48 +0,0 @@ -use criterion::{criterion_group, criterion_main, Criterion, Throughput}; -use hls_m3u8; -use hls_m3u8::tags::{ExtXDateRange, ExtXProgramDateTime}; -use hls_m3u8::types::Value; -use hls_m3u8::{MediaPlaylist, MediaSegment}; -use std::str::FromStr; - -fn create_manifest_data() -> Vec { - let mut builder = MediaPlaylist::builder(); - builder.media_sequence(826176645); - builder.has_independent_segments(true); - builder.target_duration(std::time::Duration::from_secs(2)); - for i in 0..4000 { - let mut seg = MediaSegment::builder(); - seg.duration(std::time::Duration::from_secs_f64(1.92)) - .uri(format!( - "avc_unencrypted_global-video=3000000-{}.ts?variant=italy", - 826176659 + i - )); - if i == 0 { - seg.program_date_time(ExtXProgramDateTime::new("2020-04-07T11:32:38Z")); - } - if i % 100 == 0 { - let mut date_range = - ExtXDateRange::new(format!("{}", i / 100), "2020-04-07T11:40:02.040000Z"); - date_range.duration = Some(std::time::Duration::from_secs_f64(65.2)); - date_range.client_attributes.insert("SCTE35-OUT".to_string(), Value::Hex(hex::decode("FC302500000000000000FFF0140500001C207FEFFE0030E3A0FE005989E000010000000070BA5ABF").unwrap())); - seg.date_range(date_range); - } - builder.push_segment(seg.build().unwrap()); - } - builder.build().unwrap().to_string().into_bytes() -} - -fn criterion_benchmark(c: &mut Criterion) { - let buf = create_manifest_data(); - let mut group = c.benchmark_group("parser"); - group.throughput(Throughput::Bytes(buf.len() as u64)); - group.bench_function("throughput", |b| { - b.iter(|| { - let buf = String::from_utf8_lossy(&buf); - hls_m3u8::MediaPlaylist::from_str(&buf).unwrap() - }); - }); -} - -criterion_group!(benches, criterion_benchmark); -criterion_main!(benches);