use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; use hittekaart::{ gpx, renderer::{self, heatmap, marktile, tilehunt, Renderer}, }; static BENCH_DATA: &str = include_str!("bench.gpx"); fn benchmark(c: &mut Criterion, name: &str, renderer: R) where R: Renderer, R::Prepared: Clone, { let data = vec![gpx::extract_from_str(BENCH_DATA).unwrap()]; c.bench_function(&format!("{name}/Renderer::prepare"), |b| { b.iter(|| renderer::prepare(&renderer, 19, &data, || Ok(())).unwrap()); }); let prepared = renderer::prepare(&renderer, 19, &data, || Ok(())).unwrap(); c.bench_function(&format!("{name}/Renderer::colorize"), |b| { b.iter_batched( || prepared.clone(), |prepared| { renderer::colorize(&renderer, prepared, |tile| { black_box(tile); Ok(()) }) .unwrap(); }, BatchSize::SmallInput, ); }); } fn criterion_benchmark(c: &mut Criterion) { c.bench_function("extract_from_str", |b| { b.iter(|| gpx::extract_from_str(BENCH_DATA).unwrap()) }); benchmark(c, "heatmap", heatmap::Renderer); benchmark(c, "marktile", marktile::Renderer); benchmark(c, "tilehunt", tilehunt::Renderer::new(19)); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches);