//! Benchmarks for the Terrace Rust implementation. use criterion::{black_box, criterion_group, criterion_main, Criterion}; use terrace::{TerraceDocument, StringReader}; fn bench_simple_parsing(c: &mut Criterion) { let content = r#" config database host localhost port 5432 name mydb ssl true server port 3000 host 0.0.0.0 ssl enabled workers 4 logging level info file /var/log/app.log "#; c.bench_function("parse_simple_config", |b| { b.iter(|| { let reader = StringReader::new(black_box(content)); let mut doc = TerraceDocument::with_reader(reader); let mut count = 0; while let Some(node) = pollster::block_on(doc.next()) { count += 1; } black_box(count); }) }); } fn bench_large_document(c: &mut Criterion) { let mut content = String::new(); for i in 0..1000 { content.push_str(&format!("item{}\n value{}\n nested{}\n", i, i, i)); } c.bench_function("parse_large_document", |b| { b.iter(|| { let reader = StringReader::new(black_box(&content)); let mut doc = TerraceDocument::with_reader(reader); let mut count = 0; while let Some(node) = pollster::block_on(doc.next()) { count += 1; } black_box(count); }) }); } fn bench_filtering(c: &mut Criterion) { let content = r#" users user alice active user bob inactive user charlie active user david inactive user eve active groups group admins member alice member charlie group users member bob member david member eve "#; c.bench_function("filter_active_users", |b| { b.iter(|| { let reader = StringReader::new(black_box(content)); let doc = TerraceDocument::with_reader(reader); let active_users = pollster::block_on(doc.filter(|node| { node.head() == "user" && node.tail().contains("active") })); black_box(active_users.len()); }) }); } criterion_group!(benches, bench_simple_parsing, bench_large_document, bench_filtering); criterion_main!(benches);