diff --git a/Cargo.toml b/Cargo.toml index 1a44820c..f0d5750c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,12 +59,16 @@ fakeit = "1.1" itertools = "0.10" rand = "0.8" +[[bench]] +name = "block" +harness = false + [[bench]] name = "paragraph" harness = false [[bench]] -name = "block" +name = "sparkline" harness = false [[bench]] diff --git a/benches/sparkline.rs b/benches/sparkline.rs new file mode 100644 index 00000000..4009e1fc --- /dev/null +++ b/benches/sparkline.rs @@ -0,0 +1,45 @@ +use criterion::{criterion_group, criterion_main, Bencher, BenchmarkId, Criterion}; +use rand::Rng; +use ratatui::{ + buffer::Buffer, + layout::Rect, + widgets::{Sparkline, Widget}, +}; + +/// Benchmark for rendering a sparkline. +pub fn sparkline(c: &mut Criterion) { + let mut group = c.benchmark_group("sparkline"); + let mut rng = rand::thread_rng(); + + for data_count in [64, 256, 2048] { + let data: Vec = (0..data_count) + .map(|_| rng.gen_range(0..data_count)) + .collect(); + + // Render a basic sparkline + group.bench_with_input( + BenchmarkId::new("render", data_count), + &Sparkline::default().data(&data), + render, + ); + } + + group.finish(); +} + +/// render the block into a buffer of the given `size` +fn render(bencher: &mut Bencher, sparkline: &Sparkline) { + let mut buffer = Buffer::empty(Rect::new(0, 0, 200, 50)); + // We use `iter_batched` to clone the value in the setup function. + // See https://github.com/ratatui-org/ratatui/pull/377. + bencher.iter_batched( + || sparkline.clone(), + |bench_sparkline| { + bench_sparkline.render(buffer.area, &mut buffer); + }, + criterion::BatchSize::LargeInput, + ) +} + +criterion_group!(benches, sparkline); +criterion_main!(benches);