use criterion::{Criterion, criterion_group, criterion_main};
use std::hint::black_box;
use yo_resp::{Argv, Limits, Out, Proto, Step};
fn decode(c: &mut Criterion) {
let limits = Limits::default();
let mut g = c.benchmark_group("decode");
let set = b"*3\r\n$3\r\nSET\r\n$16\r\nkey:000000000001\r\n$16\r\nvalue00000000001\r\n";
g.bench_function("set", |b| {
let mut argv = Argv::new();
b.iter(|| {
let step = argv.decode(black_box(&set[..]), &limits).unwrap();
debug_assert!(matches!(step, Step::Command { .. }));
black_box(step)
});
});
let get = b"*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000001\r\n";
g.bench_function("get", |b| {
let mut argv = Argv::new();
b.iter(|| {
let step = argv.decode(black_box(&get[..]), &limits).unwrap();
black_box(step)
});
});
let mut pipeline = Vec::new();
for _ in 0..16 {
pipeline.extend_from_slice(get);
}
g.bench_function("get_pipelined_16", |b| {
let mut argv = Argv::new();
b.iter(|| {
let buf = black_box(&pipeline[..]);
let mut at = 0;
let mut n = 0;
while let Ok(Step::Command { consumed }) = argv.decode(&buf[at..], &limits) {
if consumed == 0 {
break;
}
at += consumed;
n += 1;
}
black_box(n)
});
});
g.bench_function("inline", |b| {
let mut argv = Argv::new();
b.iter(|| {
let step = argv
.decode(black_box(&b"SET key:000000000001 value\r\n"[..]), &limits)
.unwrap();
black_box(step)
});
});
g.finish();
}
fn encode(c: &mut Criterion) {
let mut g = c.benchmark_group("encode");
g.bench_function("ok", |b| {
let mut out = Out::new(Proto::Resp2);
b.iter(|| {
out.clear();
out.ok();
black_box(out.len())
});
});
let value = vec![b'v'; 64];
g.bench_function("bulk_64", |b| {
let mut out = Out::new(Proto::Resp2);
b.iter(|| {
out.clear();
out.bulk(black_box(&value));
black_box(out.len())
});
});
g.bench_function("int", |b| {
let mut out = Out::new(Proto::Resp2);
b.iter(|| {
out.clear();
out.int(black_box(1_234_567_890));
black_box(out.len())
});
});
for (name, proto) in [
("map_10_resp2", Proto::Resp2),
("map_10_resp3", Proto::Resp3),
] {
g.bench_function(name, |b| {
let mut out = Out::new(proto);
b.iter(|| {
out.clear();
out.map(10);
for i in 0..10i64 {
out.bulk(b"field");
out.int(black_box(i));
}
black_box(out.len())
});
});
}
g.finish();
}
criterion_group!(benches, decode, encode);
criterion_main!(benches);