зеркало из
https://github.com/glebtv/tui-textarea.git
synced 2026-08-28 11:36:17 +03:00
add benchmark suites for text search
Этот коммит содержится в:
@@ -9,7 +9,7 @@ license = "MIT"
|
||||
bench = false
|
||||
|
||||
[dependencies]
|
||||
tui-textarea = { path = "..", default-features = false }
|
||||
tui-textarea = { path = "..", default-features = false, features = ["search"] }
|
||||
tui = { version = "0.18", default-features = false }
|
||||
|
||||
[dev-dependencies]
|
||||
@@ -19,3 +19,7 @@ rand = { version = "0.8.5", features = ["small_rng"] }
|
||||
[[bench]]
|
||||
name = "insert"
|
||||
harness = false
|
||||
|
||||
[[bench]]
|
||||
name = "search"
|
||||
harness = false
|
||||
|
||||
@@ -2,21 +2,7 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion};
|
||||
use rand::rngs::SmallRng;
|
||||
use rand::{Rng, SeedableRng};
|
||||
use tui_textarea::{CursorMove, Input, Key, TextArea};
|
||||
use tui_textarea_bench::dummy_terminal;
|
||||
|
||||
const LOREM: &[&str] = &[
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do",
|
||||
"eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim",
|
||||
"ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut",
|
||||
"aliquip ex ea commodo consequat. Duis aute irure dolor in",
|
||||
"reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla",
|
||||
"pariatur. Excepteur sint occaecat cupidatat non proident, sunt in",
|
||||
"culpa qui officia deserunt mollit anim id est laborum.",
|
||||
];
|
||||
const SEED: [u8; 32] = [
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
|
||||
27, 28, 29, 30, 31, 32,
|
||||
];
|
||||
use tui_textarea_bench::{dummy_terminal, TerminalExt, LOREM, SEED};
|
||||
|
||||
#[inline]
|
||||
fn append_lorem(repeat: usize) -> usize {
|
||||
@@ -30,10 +16,7 @@ fn append_lorem(repeat: usize) -> usize {
|
||||
ctrl: false,
|
||||
alt: false,
|
||||
});
|
||||
term.draw(|f| {
|
||||
f.render_widget(textarea.widget(), f.size());
|
||||
})
|
||||
.unwrap();
|
||||
term.draw_textarea(&textarea);
|
||||
}
|
||||
}
|
||||
textarea.input(Input {
|
||||
@@ -41,10 +24,7 @@ fn append_lorem(repeat: usize) -> usize {
|
||||
ctrl: false,
|
||||
alt: false,
|
||||
});
|
||||
term.draw(|f| {
|
||||
f.render_widget(textarea.widget(), f.size());
|
||||
})
|
||||
.unwrap();
|
||||
term.draw_textarea(&textarea);
|
||||
}
|
||||
textarea.lines().len()
|
||||
}
|
||||
@@ -66,10 +46,7 @@ fn random_lorem(repeat: usize) -> usize {
|
||||
ctrl: false,
|
||||
alt: false,
|
||||
});
|
||||
term.draw(|f| {
|
||||
f.render_widget(textarea.widget(), f.size());
|
||||
})
|
||||
.unwrap();
|
||||
term.draw_textarea(&textarea);
|
||||
|
||||
for c in line.chars() {
|
||||
textarea.input(Input {
|
||||
@@ -77,10 +54,7 @@ fn random_lorem(repeat: usize) -> usize {
|
||||
ctrl: false,
|
||||
alt: false,
|
||||
});
|
||||
term.draw(|f| {
|
||||
f.render_widget(textarea.widget(), f.size());
|
||||
})
|
||||
.unwrap();
|
||||
term.draw_textarea(&textarea);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
62
bench/benches/search.rs
Обычный файл
62
bench/benches/search.rs
Обычный файл
@@ -0,0 +1,62 @@
|
||||
use criterion::{criterion_group, criterion_main, Criterion};
|
||||
use tui_textarea::TextArea;
|
||||
use tui_textarea_bench::{dummy_terminal, TerminalExt, LOREM};
|
||||
|
||||
fn forward(c: &mut Criterion) {
|
||||
#[inline]
|
||||
fn run(pat: &str, lines: Vec<String>) {
|
||||
let mut term = dummy_terminal();
|
||||
let mut textarea: TextArea = TextArea::new(lines);
|
||||
textarea.set_search_pattern(pat).unwrap();
|
||||
term.draw_textarea(&textarea);
|
||||
for _ in 0..100 {
|
||||
textarea.search_forward(false);
|
||||
term.draw_textarea(&textarea);
|
||||
}
|
||||
textarea.set_search_pattern(r"").unwrap();
|
||||
term.draw_textarea(&textarea);
|
||||
}
|
||||
|
||||
c.bench_function("search::forward_short", |b| {
|
||||
let lines: Vec<_> = LOREM.iter().map(|s| s.to_string()).collect();
|
||||
b.iter(move || run(r"\w*i\w*", lines.clone()))
|
||||
});
|
||||
c.bench_function("search::forward_long", |b| {
|
||||
let mut lines = vec![];
|
||||
for _ in 0..10 {
|
||||
lines.extend(LOREM.iter().map(|s| s.to_string()));
|
||||
}
|
||||
b.iter(move || run(r"[A-Z]\w*", lines.clone()))
|
||||
});
|
||||
}
|
||||
|
||||
fn back(c: &mut Criterion) {
|
||||
#[inline]
|
||||
fn run(pat: &str, lines: Vec<String>) {
|
||||
let mut term = dummy_terminal();
|
||||
let mut textarea: TextArea = TextArea::new(lines);
|
||||
textarea.set_search_pattern(pat).unwrap();
|
||||
term.draw_textarea(&textarea);
|
||||
for _ in 0..100 {
|
||||
textarea.search_back(false);
|
||||
term.draw_textarea(&textarea);
|
||||
}
|
||||
textarea.set_search_pattern(r"").unwrap();
|
||||
term.draw_textarea(&textarea);
|
||||
}
|
||||
|
||||
c.bench_function("search::back_short", |b| {
|
||||
let lines: Vec<_> = LOREM.iter().map(|s| s.to_string()).collect();
|
||||
b.iter(move || run(r"\w*i\w*", lines.clone()))
|
||||
});
|
||||
c.bench_function("search::back_long", |b| {
|
||||
let mut lines = vec![];
|
||||
for _ in 0..10 {
|
||||
lines.extend(LOREM.iter().map(|s| s.to_string()));
|
||||
}
|
||||
b.iter(move || run(r"[A-Z]\w*", lines.clone()))
|
||||
});
|
||||
}
|
||||
|
||||
criterion_group!(search, forward, back);
|
||||
criterion_main!(search);
|
||||
@@ -6,6 +6,21 @@ use tui::backend::Backend;
|
||||
use tui::buffer::Cell;
|
||||
use tui::layout::Rect;
|
||||
use tui::Terminal;
|
||||
use tui_textarea::TextArea;
|
||||
|
||||
pub const LOREM: &[&str] = &[
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do",
|
||||
"eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim",
|
||||
"ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut",
|
||||
"aliquip ex ea commodo consequat. Duis aute irure dolor in",
|
||||
"reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla",
|
||||
"pariatur. Excepteur sint occaecat cupidatat non proident, sunt in",
|
||||
"culpa qui officia deserunt mollit anim id est laborum.",
|
||||
];
|
||||
pub const SEED: [u8; 32] = [
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
|
||||
27, 28, 29, 30, 31, 32,
|
||||
];
|
||||
|
||||
pub struct DummyBackend {
|
||||
width: u16,
|
||||
@@ -69,3 +84,14 @@ impl Backend for DummyBackend {
|
||||
pub fn dummy_terminal() -> Terminal<DummyBackend> {
|
||||
Terminal::new(DummyBackend::default()).unwrap()
|
||||
}
|
||||
|
||||
pub trait TerminalExt {
|
||||
fn draw_textarea(&mut self, textarea: &TextArea<'_>);
|
||||
}
|
||||
|
||||
impl TerminalExt for Terminal<DummyBackend> {
|
||||
fn draw_textarea(&mut self, textarea: &TextArea<'_>) {
|
||||
self.draw(|f| f.render_widget(textarea.widget(), f.size()))
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user