use bytes::Bytes;
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
use dbus_message_parser::message::Message;
use std::time::Duration;
static MSG_1: &[u8; 90] =
b"\x6c\x02\x01\x01\x0a\x00\x00\x00\x01\x00\x00\x00\x3d\x00\x00\x00\x06\x01\x73\x00\x05\x00\x00\
\x00\x3a\x31\x2e\x39\x38\x00\x00\x00\x05\x01\x75\x00\x01\x00\x00\x00\x08\x01\x67\x00\x01\x73\
\x00\x00\x07\x01\x73\x00\x14\x00\x00\x00\x6f\x72\x67\x2e\x66\x72\x65\x65\x64\x65\x73\x6b\x74\
\x6f\x70\x2e\x44\x42\x75\x73\x00\x00\x00\x00\x05\x00\x00\x00\x3a\x31\x2e\x39\x38\x00";
static MSG_2: &[u8; 308] =
b"\x6c\x02\x01\x01\xec\x00\x00\x00\x60\x00\x00\x00\x36\x00\x00\x00\x06\x01\x73\x00\x06\x00\x00\
\x00\x3a\x31\x2e\x31\x30\x35\x00\x00\x08\x01\x67\x00\x0a\x61\x7b\x73\x28\x62\x67\x61\x76\x29\
\x7d\x00\x05\x01\x75\x00\x39\x01\x00\x00\x07\x01\x73\x00\x05\x00\x00\x00\x3a\x31\x2e\x39\x39\
\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x71\x75\x69\x74\x00\x00\x00\x00\
\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\
\x00\x6e\x65\x77\x2d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x70\x72\x65\x66\x65\
\x72\x65\x6e\x63\x65\x73\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x09\x00\x00\x00\x73\x68\x6f\x72\x74\x63\x75\x74\x73\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x68\x65\x6c\x70\x00\x00\x00\x00\x00\x00\
\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x61\
\x62\x6f\x75\x74\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x0a\x00\x00\x00\x6e\x65\x77\x2d\x77\x69\x6e\x64\x6f\x77\x00\x00\x01\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00";
static MSG_3: &[u8; 252] =
b"\x6c\x04\x01\x01\x74\x00\x00\x00\xb8\x00\x00\x00\x76\x00\x00\x00\x01\x01\x6f\x00\x10\x00\x00\
\x00\x2f\x6f\x72\x67\x2f\x67\x6e\x6f\x6d\x65\x2f\x64\x66\x65\x65\x74\x00\x00\x00\x00\x00\x00\
\x00\x00\x02\x01\x73\x00\x0f\x00\x00\x00\x6f\x72\x67\x2e\x67\x74\x6b\x2e\x41\x63\x74\x69\x6f\
\x6e\x73\x00\x08\x01\x67\x00\x16\x61\x73\x61\x7b\x73\x62\x7d\x61\x7b\x73\x76\x7d\x61\x7b\x73\
\x28\x62\x67\x61\x76\x29\x7d\x00\x00\x00\x00\x00\x03\x01\x73\x00\x07\x00\x00\x00\x43\x68\x61\
\x6e\x67\x65\x64\x00\x07\x01\x73\x00\x05\x00\x00\x00\x3a\x31\x2e\x38\x39\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x04\
\x00\x00\x00\x68\x65\x6c\x70\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x61\x62\x6f\x75\x74\x00\x00\x00\x00\x00\x00\
\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x71\x75\
\x69\x74\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
static MSG_4: &[u8; 160] =
b"\x6c\x01\x00\x01\x00\x00\x00\x00\xbd\x00\x00\x00\x8e\x00\x00\x00\x01\x01\x6f\x00\x04\x00\x00\
\x00\x2f\x6f\x72\x67\x00\x00\x00\x00\x02\x01\x73\x00\x23\x00\x00\x00\x6f\x72\x67\x2e\x66\x72\
\x65\x65\x64\x65\x73\x6b\x74\x6f\x70\x2e\x44\x42\x75\x73\x2e\x49\x6e\x74\x72\x6f\x73\x70\x65\
\x63\x74\x61\x62\x6c\x65\x00\x00\x00\x00\x00\x06\x01\x73\x00\x1c\x00\x00\x00\x6f\x72\x67\x2e\
\x66\x72\x65\x65\x64\x65\x73\x6b\x74\x6f\x70\x2e\x46\x69\x6c\x65\x4d\x61\x6e\x61\x67\x65\x72\
\x31\x00\x00\x00\x00\x03\x01\x73\x00\x0a\x00\x00\x00\x49\x6e\x74\x72\x6f\x73\x70\x65\x63\x74\
\x00\x00\x00\x00\x00\x00\x07\x01\x73\x00\x05\x00\x00\x00\x3a\x31\x2e\x38\x39\x00\x00\x00";
static MESSAGES: [(&[u8], &str); 4] = [
(MSG_1, "msg_1"),
(MSG_2, "msg_2"),
(MSG_3, "msg_3"),
(MSG_4, "msg_4"),
];
fn decode(c: &mut Criterion) {
let mut group = c.benchmark_group("decode");
for (msg, name) in MESSAGES.iter() {
let msg = Bytes::from_static(msg);
let name = name.to_owned();
let throughput = Throughput::Bytes(msg.len() as u64);
let benchmark_id = BenchmarkId::new(name, msg.len());
group.throughput(throughput);
group.bench_with_input(benchmark_id, &msg, |b, msg| {
b.iter(|| Message::decode(msg.clone()).unwrap())
});
}
group.finish();
}
fn encode(c: &mut Criterion) {
let mut group = c.benchmark_group("encode");
for (msg, name) in MESSAGES.iter() {
let msg = Bytes::from_static(msg);
let (msg, _) = Message::decode(msg).unwrap();
let bytes = msg.encode().unwrap();
let name = name.to_owned();
let throughput = Throughput::Bytes(bytes.len() as u64);
let benchmark_id = BenchmarkId::new(name, bytes.len());
group.throughput(throughput);
group.bench_with_input(benchmark_id, &msg, |b, msg| {
b.iter(|| msg.encode().unwrap())
});
}
group.finish();
}
criterion_group! {
name = benches;
config = Criterion::default()
.sample_size(1024)
.measurement_time(Duration::from_secs(10));
targets = decode, encode
}
criterion_main!(benches);