Skip to content

Commit

Permalink
test(barchart): add benchmarks (#455)
Browse files Browse the repository at this point in the history
  • Loading branch information
Valentin271 authored Sep 2, 2023
1 parent 47ae602 commit ea70bff
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 3 deletions.
10 changes: 7 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -80,20 +80,24 @@ all-features = true
cargo-args = ["-Zunstable-options", "-Zrustdoc-scrape-examples"]
rustdoc-args = ["--cfg", "docsrs"]

[[bench]]
name = "barchart"
harness = false

[[bench]]
name = "block"
harness = false

[[bench]]
name = "paragraph"
name = "list"
harness = false

[[bench]]
name = "sparkline"
name = "paragraph"
harness = false

[[bench]]
name = "list"
name = "sparkline"
harness = false


Expand Down
73 changes: 73 additions & 0 deletions benches/barchart.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
use criterion::{criterion_group, criterion_main, Bencher, BenchmarkId, Criterion};
use rand::Rng;
use ratatui::{
buffer::Buffer,
layout::Rect,
prelude::Direction,
widgets::{Bar, BarChart, BarGroup, Widget},
};

/// Benchmark for rendering a barchart.
pub fn barchart(c: &mut Criterion) {
let mut group = c.benchmark_group("barchart");
let mut rng = rand::thread_rng();

for data_count in [64, 256, 2048] {
let data: Vec<Bar> = (0..data_count)
.map(|i| {
Bar::default()
.label(format!("B{i}").into())
.value(rng.gen_range(0..data_count))
})
.collect();

let bargroup = BarGroup::default().bars(&data);

// Render a basic barchart
group.bench_with_input(
BenchmarkId::new("render", data_count),
&BarChart::default().data(bargroup.clone()),
render,
);

// Render an horizontal barchart
group.bench_with_input(
BenchmarkId::new("render_horizontal", data_count),
&BarChart::default()
.direction(Direction::Horizontal)
.data(bargroup.clone()),
render,
);

// Render a barchart with multiple groups
group.bench_with_input(
BenchmarkId::new("render_grouped", data_count),
&BarChart::default()
// We call `data` multiple time to add multiple groups.
// This is not a duplicated call.
.data(bargroup.clone())
.data(bargroup.clone())
.data(bargroup.clone()),
render,
);
}

group.finish();
}

/// Render the widget in a classical size buffer
fn render(bencher: &mut Bencher, barchart: &BarChart) {
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(
|| barchart.clone(),
|bench_barchart| {
bench_barchart.render(buffer.area, &mut buffer);
},
criterion::BatchSize::LargeInput,
)
}

criterion_group!(benches, barchart);
criterion_main!(benches);

0 comments on commit ea70bff

Please sign in to comment.