use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
use rustis::resp::BenchPubSubPush;
use std::hint::black_box;
fn build_message_push(channel: &str, payload_len: usize) -> Vec<u8> {
let payload = vec![b'x'; payload_len];
let mut buf = b">3\r\n$7\r\nmessage\r\n".to_vec();
buf.extend_from_slice(format!("${}\r\n{channel}\r\n", channel.len()).as_bytes());
buf.extend_from_slice(format!("${payload_len}\r\n").as_bytes());
buf.extend_from_slice(&payload);
buf.extend_from_slice(b"\r\n");
buf
}
const PAYLOAD_SIZES: [usize; 6] = [8, 24, 56, 100, 512, 4096];
fn bench_delivery(c: &mut Criterion) {
let mut group = c.benchmark_group("pub_sub_decode/delivery");
for size in PAYLOAD_SIZES {
let push = build_message_push("mychannel", size);
let mut held = BenchPubSubPush::new(&push).unwrap();
group.bench_function(BenchmarkId::new("boxed_slice", size), |b| {
b.iter(|| black_box(held.deliver().unwrap()))
});
let mut held = BenchPubSubPush::new(&push).unwrap();
group.bench_function(BenchmarkId::new("three_vecs", size), |b| {
b.iter(|| black_box(held.deliver_owned().unwrap()))
});
let mut held = BenchPubSubPush::new(&push).unwrap();
group.bench_function(BenchmarkId::new("inline_buffer", size), |b| {
b.iter(|| black_box(held.deliver_inline().unwrap()))
});
}
group.finish();
}
criterion_group!(benches, bench_delivery);
criterion_main!(benches);