зеркало из
https://github.com/glebtv/tui-textarea.git
synced 2026-09-08 00:15:50 +03:00
add benchmark suites for text search
Этот коммит содержится в:
@@ -1,3 +1,3 @@
|
|||||||
[alias]
|
[alias]
|
||||||
watch-check = ["watch", "-x", "check --examples --all-features"]
|
watch-check = ["watch", "-x", "check --examples --all-features --all --benches"]
|
||||||
watch-test = ["watch", "-x", "test --all-features -- --skip=src/lib.rs", "-w", "src"]
|
watch-test = ["watch", "-x", "test --all-features -- --skip=src/lib.rs", "-w", "src"]
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ license = "MIT"
|
|||||||
bench = false
|
bench = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tui-textarea = { path = "..", default-features = false }
|
tui-textarea = { path = "..", default-features = false, features = ["search"] }
|
||||||
tui = { version = "0.18", default-features = false }
|
tui = { version = "0.18", default-features = false }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
@@ -19,3 +19,7 @@ rand = { version = "0.8.5", features = ["small_rng"] }
|
|||||||
[[bench]]
|
[[bench]]
|
||||||
name = "insert"
|
name = "insert"
|
||||||
harness = false
|
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::rngs::SmallRng;
|
||||||
use rand::{Rng, SeedableRng};
|
use rand::{Rng, SeedableRng};
|
||||||
use tui_textarea::{CursorMove, Input, Key, TextArea};
|
use tui_textarea::{CursorMove, Input, Key, TextArea};
|
||||||
use tui_textarea_bench::dummy_terminal;
|
use tui_textarea_bench::{dummy_terminal, TerminalExt, LOREM, SEED};
|
||||||
|
|
||||||
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,
|
|
||||||
];
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn append_lorem(repeat: usize) -> usize {
|
fn append_lorem(repeat: usize) -> usize {
|
||||||
@@ -30,10 +16,7 @@ fn append_lorem(repeat: usize) -> usize {
|
|||||||
ctrl: false,
|
ctrl: false,
|
||||||
alt: false,
|
alt: false,
|
||||||
});
|
});
|
||||||
term.draw(|f| {
|
term.draw_textarea(&textarea);
|
||||||
f.render_widget(textarea.widget(), f.size());
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
textarea.input(Input {
|
textarea.input(Input {
|
||||||
@@ -41,10 +24,7 @@ fn append_lorem(repeat: usize) -> usize {
|
|||||||
ctrl: false,
|
ctrl: false,
|
||||||
alt: false,
|
alt: false,
|
||||||
});
|
});
|
||||||
term.draw(|f| {
|
term.draw_textarea(&textarea);
|
||||||
f.render_widget(textarea.widget(), f.size());
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
}
|
}
|
||||||
textarea.lines().len()
|
textarea.lines().len()
|
||||||
}
|
}
|
||||||
@@ -66,10 +46,7 @@ fn random_lorem(repeat: usize) -> usize {
|
|||||||
ctrl: false,
|
ctrl: false,
|
||||||
alt: false,
|
alt: false,
|
||||||
});
|
});
|
||||||
term.draw(|f| {
|
term.draw_textarea(&textarea);
|
||||||
f.render_widget(textarea.widget(), f.size());
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
for c in line.chars() {
|
for c in line.chars() {
|
||||||
textarea.input(Input {
|
textarea.input(Input {
|
||||||
@@ -77,10 +54,7 @@ fn random_lorem(repeat: usize) -> usize {
|
|||||||
ctrl: false,
|
ctrl: false,
|
||||||
alt: false,
|
alt: false,
|
||||||
});
|
});
|
||||||
term.draw(|f| {
|
term.draw_textarea(&textarea);
|
||||||
f.render_widget(textarea.widget(), f.size());
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
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::buffer::Cell;
|
||||||
use tui::layout::Rect;
|
use tui::layout::Rect;
|
||||||
use tui::Terminal;
|
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 {
|
pub struct DummyBackend {
|
||||||
width: u16,
|
width: u16,
|
||||||
@@ -69,3 +84,14 @@ impl Backend for DummyBackend {
|
|||||||
pub fn dummy_terminal() -> Terminal<DummyBackend> {
|
pub fn dummy_terminal() -> Terminal<DummyBackend> {
|
||||||
Terminal::new(DummyBackend::default()).unwrap()
|
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