speed up latency

This commit is contained in:
Conrad Ludgate 2023-04-10 23:25:22 +01:00
parent 2dbb178603
commit e12ae58c07
No known key found for this signature in database
GPG Key ID: 197E3CACA1C980B5
3 changed files with 27 additions and 6 deletions

View File

@ -180,7 +180,7 @@ impl DrawState<'_> {
if let Some(parsed) = parsed { if let Some(parsed) = parsed {
theme.highlight(&h.command, parsed, &mut |t, style| { theme.highlight(&h.command, parsed, &mut |t, style| {
if t.is_empty() { if t == "\n" {
self.x += 1; self.x += 1;
} else { } else {
self.draw(t, with_select(style)); self.draw(t, with_select(style));

View File

@ -1,7 +1,7 @@
use std::{ use std::{
collections::HashMap, collections::HashMap,
io::{stdout, Write}, io::{stdout, Write},
time::Duration, time::{Duration, Instant},
}; };
use crossterm::{ use crossterm::{
@ -58,12 +58,20 @@ impl State {
async fn query_results(&mut self, db: &mut dyn Database) -> Result<Vec<History>> { async fn query_results(&mut self, db: &mut dyn Database) -> Result<Vec<History>> {
let results = self.engine.query(&self.search, db).await?; let results = self.engine.query(&self.search, db).await?;
self.results_state.select(0); self.results_state.select(0);
for h in &results { Ok(results)
}
fn highlight_results(&mut self, results: &[History]) -> bool {
let start = Instant::now();
for h in results {
if start.elapsed() > Duration::from_millis(10) {
return true;
}
self.results_parsed self.results_parsed
.entry(h.id.clone()) .entry(h.id.clone())
.or_insert_with(|| self.syntax.parse_shell(&h.command)); .or_insert_with(|| self.syntax.parse_shell(&h.command));
} }
Ok(results) false
} }
fn handle_input(&mut self, settings: &Settings, input: &Event, len: usize) -> Option<usize> { fn handle_input(&mut self, settings: &Settings, input: &Event, len: usize) -> Option<usize> {
@ -566,7 +574,20 @@ pub async fn history(
let initial_filter_mode = app.search.filter_mode; let initial_filter_mode = app.search.filter_mode;
let initial_search_mode = app.search_mode; let initial_search_mode = app.search_mode;
let event_ready = tokio::task::spawn_blocking(|| event::poll(Duration::from_millis(250))); // highlight any new results found.
// this uses a cache internally so it is quick at skipping
// previously seen commands
let highlight_interrupted = app.highlight_results(&results);
// if we didn't get around to highlighting all the results, we should consider
// triggering a re-draw sooner.
let wait = if highlight_interrupted {
Duration::from_millis(10)
} else {
Duration::from_millis(250)
};
let event_ready = tokio::task::spawn_blocking(move || event::poll(wait));
tokio::select! { tokio::select! {
event_ready = event_ready => { event_ready = event_ready => {

View File

@ -19,7 +19,7 @@ impl Theme {
let mut stack = ScopeStack::default(); let mut stack = ScopeStack::default();
let mut styles: Vec<(f64, Style)> = vec![]; let mut styles: Vec<(f64, Style)> = vec![];
for (line, parsed_line) in h.lines().zip(parsed) { for (line, parsed_line) in h.lines().zip(parsed) {
draw("", Style::default()); draw("\n", Style::default());
let mut last = 0; let mut last = 0;
for &(index, ref op) in parsed_line { for &(index, ref op) in parsed_line {