use criterion::{BenchmarkId, Criterion, Throughput, criterion_group, criterion_main};
use rustis::resp::{bench_decode_stream_grow, bench_decode_stream_prereserve};
use std::hint::black_box;
fn build_bulk_string(payload: usize) -> Vec<u8> {
let mut buf = Vec::with_capacity(payload + 32);
buf.extend_from_slice(format!("${payload}\r\n").as_bytes());
buf.resize(buf.len() + payload, b'x');
buf.extend_from_slice(b"\r\n");
buf
}
fn bench(c: &mut Criterion) {
const CHUNK: usize = 16 * 1024;
let mut group = c.benchmark_group("large_reply_reserve");
for &mib in &[1usize, 4, 16] {
let payload = mib * 1024 * 1024;
let data = build_bulk_string(payload);
group.throughput(Throughput::Bytes(data.len() as u64));
group.bench_with_input(
BenchmarkId::new("grow_by_doubling", format!("{mib}MiB")),
&data,
|b, data| {
b.iter(|| black_box(bench_decode_stream_grow(black_box(data), CHUNK).unwrap()))
},
);
group.bench_with_input(
BenchmarkId::new("reserve_once", format!("{mib}MiB")),
&data,
|b, data| {
b.iter(|| {
black_box(bench_decode_stream_prereserve(black_box(data), CHUNK).unwrap())
})
},
);
}
group.finish();
}
criterion_group!(benches, bench);
criterion_main!(benches);