use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput}; use mutnet::addresses::mac::MacAddress; use mutnet::arp::{ArpMethods, ParseArpError}; include!("utils.rs"); #[inline(always)] fn mutnet_new( bytes: &mut [u8], ) -> Result>, ParseArpError> { DataBuffer::<_, Arp>::parse_arp_alone(bytes, 0) } #[inline(always)] fn mutnet_get_functions_inlined( data_buffer: &impl ArpMethods, ) -> ( u16, u16, u16, u8, u8, MacAddress, Ipv4Addr, MacAddress, Ipv4Addr, ) { ( data_buffer.arp_hardware_type(), data_buffer.arp_protocol_type(), data_buffer.arp_operation_code(), data_buffer.arp_hardware_address_length(), data_buffer.arp_protocol_address_length(), data_buffer.arp_sender_hardware_address(), data_buffer.arp_sender_protocol_address(), data_buffer.arp_target_hardware_address(), data_buffer.arp_target_protocol_address(), ) } #[inline(never)] fn mutnet_get_functions_not_inlined( data_buffer: &impl ArpMethods, ) -> ( u16, u16, u16, u8, u8, MacAddress, Ipv4Addr, MacAddress, Ipv4Addr, ) { ( data_buffer.arp_hardware_type(), data_buffer.arp_protocol_type(), data_buffer.arp_operation_code(), data_buffer.arp_hardware_address_length(), data_buffer.arp_protocol_address_length(), data_buffer.arp_sender_hardware_address(), data_buffer.arp_sender_protocol_address(), data_buffer.arp_target_hardware_address(), data_buffer.arp_target_protocol_address(), ) } pub fn arp(c: &mut Criterion) { let mut group = c.benchmark_group("arp"); group.throughput(Throughput::Bytes(random_valid_arp().len() as u64)); group.bench_function("mutnet: new", |b| { b.iter_batched_ref( random_valid_arp, |data| { let mut result = &mut mutnet_new(std::hint::black_box(data)); std::hint::black_box(&mut result); }, BatchSize::SmallInput, ); }); group.bench_function("mutnet: new + get functions inlined", |b| { b.iter_batched_ref( random_valid_arp, |data| { let buffer = DataBuffer::<_, Arp>::parse_arp_alone( std::hint::black_box(data), 0, ) .unwrap(); let mut result = &mut mutnet_get_functions_inlined(&buffer); std::hint::black_box(&mut result); }, BatchSize::SmallInput, ); }); group.bench_function("mutnet: new + get functions not inlined", |b| { b.iter_batched_ref( random_valid_arp, |data| { let buffer = DataBuffer::<_, Arp>::parse_arp_alone( std::hint::black_box(data), 0, ) .unwrap(); let mut result = &mut mutnet_get_functions_not_inlined(&buffer); std::hint::black_box(&mut result); }, BatchSize::SmallInput, ); }); group.finish(); } criterion_group!(benches, arp); criterion_main!(benches);