diff --git a/benches/main/buffer.rs b/benches/main/buffer.rs index 9bcee7e2..201d67d3 100644 --- a/benches/main/buffer.rs +++ b/benches/main/buffer.rs @@ -1,11 +1,14 @@ +use std::iter::zip; + use criterion::{black_box, BenchmarkId, Criterion}; use ratatui::{ buffer::{Buffer, Cell}, layout::Rect, text::Line, + widgets::Widget, }; -criterion::criterion_group!(benches, empty, filled, with_lines); +criterion::criterion_group!(benches, empty, filled, with_lines, diff); const fn rect(size: u16) -> Rect { Rect::new(0, 0, size, size) @@ -58,3 +61,37 @@ fn with_lines(c: &mut Criterion) { } group.finish(); } + +fn diff(c: &mut Criterion) { + const AREA: Rect = Rect { + x: 0, + y: 0, + width: 200, + height: 50, + }; + c.bench_function("buffer/diff", |b| { + let buffer_1 = create_random_buffer(AREA); + let buffer_2 = create_random_buffer(AREA); + b.iter(|| { + let _ = black_box(&buffer_1).diff(black_box(&buffer_2)); + }); + }); +} + +fn create_random_buffer(area: Rect) -> Buffer { + const PARAGRAPH_COUNT: i64 = 15; + const SENTENCE_COUNT: i64 = 5; + const WORD_COUNT: i64 = 20; + const SEPARATOR: &str = "\n\n"; + let paragraphs = fakeit::words::paragraph( + PARAGRAPH_COUNT, + SENTENCE_COUNT, + WORD_COUNT, + SEPARATOR.to_string(), + ); + let mut buffer = Buffer::empty(area); + for (line, row) in zip(paragraphs.lines(), area.rows()) { + Line::from(line).render(row, &mut buffer); + } + buffer +}