use criterion::{criterion_group, criterion_main}; use criterion::{BenchmarkId, Criterion}; #[cfg(unix)] use pprof::criterion::{Output, PProfProfiler}; use ppp::v1; use std::net::{Ipv4Addr, Ipv6Addr}; fn benchmarks(c: &mut Criterion) { let mut group = c.benchmark_group("PPP Text"); let inputs = [ ("UNKNOWN", "PROXY UNKNOWN\r\n"), ("TCP4", "PROXY TCP4 255.255.255.255 255.255.255.255 65535 65535\r\n"), ("TCP6", "PROXY TCP6 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff 65535 65535\r\n"), ("TCP6 Compact", "PROXY TCP6 ffff::ffff ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff 65535 65535\r\n"), ("Worst Case", "PROXY UNKNOWN ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff 65535 65535\r\n"), ]; for (id, input) in inputs { group.bench_with_input( BenchmarkId::new("v1::Header::try_from", id), input.as_bytes(), |b, i| { b.iter(|| v1::Header::try_from(i).unwrap()); }, ); } let headers = [ ("TCP4", v1::Header::new( "PROXY TCP4 127.0.1.2 192.168.1.101 80 443\r\n", v1::Addresses::new_tcp4( Ipv4Addr::new(127, 0, 1, 2), Ipv4Addr::new(192, 168, 1, 101), 80, 443, ), )), ("TCP6", v1::Header::new( "PROXY TCP6 1234:5678:90ab:cdef:fedc:ba09:8765:4321 4321:8765:ba09:fedc:cdef:90ab:5678:1234 443 65535\r\n", v1::Addresses::new_tcp6( Ipv6Addr::from([ 0x1234, 0x5678, 0x90AB, 0xCDEF, 0xFEDC, 0xBA09, 0x8765, 0x4321, ]), Ipv6Addr::from([ 0x4321, 0x8765, 0xBA09, 0xFEDC, 0xCDEF, 0x90AB, 0x5678, 0x01234, ]), 443, 65535, ))), ("UNKNOWN", v1::Header::new("PROXY UNKNOWN\r\n", v1::Addresses::default())), ]; for (id, header) in headers { group.bench_with_input( BenchmarkId::new("v1::Header::to_string", id), &header, |b, h| { b.iter(|| h.to_string()); }, ); group.bench_with_input( BenchmarkId::new("v1::Addresses::to_string", id), &header.addresses, |b, a| { b.iter(|| a.to_string()); }, ); } group.finish(); } #[cfg(unix)] criterion_group! { name = benches; config = { Criterion::default().with_profiler(PProfProfiler::new(100, Output::Protobuf)) }; targets = benchmarks } #[cfg(not(unix))] criterion_group!(benches, benchmarks); criterion_main!(benches);