#![allow(missing_docs, unused_results)]
use criterion::{BenchmarkId, Criterion, Throughput, criterion_group, criterion_main};
use noyalib::{StreamingDeserializer, from_str};
use std::collections::BTreeMap;
use std::hint::black_box;
#[derive(Debug, serde::Deserialize)]
#[allow(dead_code)]
struct Doc {
name: String,
version: u32,
items: Vec<Item>,
}
#[derive(Debug, serde::Deserialize)]
#[allow(dead_code)]
struct Item {
id: u32,
label: String,
enabled: bool,
}
fn make_yaml(item_count: usize) -> String {
let mut s = String::with_capacity(item_count * 64);
s.push_str("name: bench-doc\nversion: 1\nitems:\n");
for i in 0..item_count {
s.push_str(&format!(
" - id: {i}\n label: item-{i}-label-text\n enabled: true\n"
));
}
s
}
fn bench_streaming_vs_value(c: &mut Criterion) {
let mut group = c.benchmark_group("streaming_vs_value");
for &(label, count) in &[
("small", 8usize),
("medium", 800usize),
("large", 8000usize),
] {
let yaml = make_yaml(count);
group.throughput(Throughput::Bytes(yaml.len() as u64));
group.bench_with_input(BenchmarkId::new("streaming", label), &yaml, |b, yaml| {
b.iter(|| {
let mut de = StreamingDeserializer::new(black_box(yaml.as_str()));
let doc: Doc = serde_core::Deserialize::deserialize(&mut de).unwrap();
black_box(doc);
});
});
group.bench_with_input(BenchmarkId::new("ast", label), &yaml, |b, yaml| {
b.iter(|| {
let v: noyalib::Value = from_str(black_box(yaml.as_str())).unwrap();
let doc: Doc = noyalib::from_value(&v).unwrap();
black_box(doc);
});
});
}
group.finish();
}
fn bench_dyn_mapping(c: &mut Criterion) {
let yaml = (0..1000)
.map(|i| format!("k{i}: value-{i}"))
.collect::<Vec<_>>()
.join("\n");
let yaml = format!("{yaml}\n");
let mut group = c.benchmark_group("dyn_mapping_deserialize");
group.throughput(Throughput::Bytes(yaml.len() as u64));
group.bench_function("streaming", |b| {
b.iter(|| {
let mut de = StreamingDeserializer::new(black_box(yaml.as_str()));
let m: BTreeMap<String, String> =
serde_core::Deserialize::deserialize(&mut de).unwrap();
black_box(m);
});
});
group.bench_function("ast", |b| {
b.iter(|| {
let v: noyalib::Value = from_str(black_box(yaml.as_str())).unwrap();
let m: BTreeMap<String, String> = noyalib::from_value(&v).unwrap();
black_box(m);
});
});
group.finish();
}
criterion_group!(benches, bench_streaming_vs_value, bench_dyn_mapping);
criterion_main!(benches);