diff options
Diffstat (limited to 'third_party/rust/audioipc2/benches/serialization.rs')
-rw-r--r-- | third_party/rust/audioipc2/benches/serialization.rs | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/third_party/rust/audioipc2/benches/serialization.rs b/third_party/rust/audioipc2/benches/serialization.rs new file mode 100644 index 0000000000..39f770a939 --- /dev/null +++ b/third_party/rust/audioipc2/benches/serialization.rs @@ -0,0 +1,93 @@ +use audioipc::codec::{Codec, LengthDelimitedCodec}; +use audioipc::messages::DeviceInfo; +use audioipc::ClientMessage; +use audioipc2 as audioipc; +use bytes::BytesMut; +use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; + +fn bench(c: &mut Criterion, name: &str, msg: impl Fn() -> ClientMessage) { + let mut codec: LengthDelimitedCodec<ClientMessage, ClientMessage> = + LengthDelimitedCodec::default(); + let mut buf = BytesMut::with_capacity(8192); + c.bench_function(&format!("encode/{}", name), |b| { + b.iter_batched( + || msg(), + |msg| { + codec.encode(msg, &mut buf).unwrap(); + buf.clear(); + }, + BatchSize::SmallInput, + ) + }); + + let mut codec: LengthDelimitedCodec<ClientMessage, ClientMessage> = + LengthDelimitedCodec::default(); + let mut buf = BytesMut::with_capacity(8192); + codec.encode(msg(), &mut buf).unwrap(); + c.bench_function(&format!("decode/{}", name), |b| { + b.iter_batched_ref( + || buf.clone(), + |buf| { + codec.decode(buf).unwrap().unwrap(); + }, + BatchSize::SmallInput, + ) + }); + + let mut codec: LengthDelimitedCodec<ClientMessage, ClientMessage> = + LengthDelimitedCodec::default(); + let mut buf = BytesMut::with_capacity(8192); + c.bench_function(&format!("roundtrip/{}", name), |b| { + b.iter_batched( + || msg(), + |msg| { + codec.encode(msg, &mut buf).unwrap(); + codec.decode(&mut buf).unwrap().unwrap(); + }, + BatchSize::SmallInput, + ) + }); +} + +pub fn criterion_benchmark(c: &mut Criterion) { + bench(c, "tiny", || ClientMessage::ClientConnected); + bench(c, "small", || ClientMessage::StreamPosition(0)); + bench(c, "medium", || { + ClientMessage::ContextEnumeratedDevices(make_device_vec(2)) + }); + bench(c, "large", || { + ClientMessage::ContextEnumeratedDevices(make_device_vec(20)) + }); + bench(c, "huge", || { + ClientMessage::ContextEnumeratedDevices(make_device_vec(128)) + }); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); + +fn make_device_vec(n: usize) -> Vec<DeviceInfo> { + let mut devices = Vec::with_capacity(n); + for i in 0..n { + let device = DeviceInfo { + devid: i, + device_id: Some(vec![0u8; 64]), + friendly_name: Some(vec![0u8; 64]), + group_id: Some(vec![0u8; 64]), + vendor_name: Some(vec![0u8; 64]), + device_type: 0, + state: 0, + preferred: 0, + format: 0, + default_format: 0, + max_channels: 0, + default_rate: 0, + max_rate: 0, + min_rate: 0, + latency_lo: 0, + latency_hi: 0, + }; + devices.push(device); + } + devices +} |