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![0 u8; 64 ]),
friendly_name: Some(vec![0 u8; 64 ]),
group_id: Some(vec![0 u8; 64 ]),
vendor_name: Some(vec![0 u8; 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
}
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-20)
¤
*© Formatika GbR, Deutschland