diff --git a/benches/navigation.rs b/benches/navigation.rs index 4c3a054..d164d08 100644 --- a/benches/navigation.rs +++ b/benches/navigation.rs @@ -1,23 +1,38 @@ +use crate::app; +use crate::ui; +use anyhow::Result; use criterion::{criterion_group, criterion_main, Criterion}; +use crossterm::execute; +use crossterm::terminal as term; +use handlebars::{handlebars_helper, Handlebars}; +use humansize::{file_size_opts as options, FileSize}; use std::fs; +use std::io::prelude::*; +use termion::get_tty; +use tui::backend::CrosstermBackend; +use tui::Terminal; use xplr::*; -fn criterion_benchmark(c: &mut Criterion) { - fs::create_dir_all("/tmp/xplr_bench").unwrap(); +const PWD: &str = "/tmp/xplr_bench"; + +handlebars_helper!(to_humansize: |size: i64| size.file_size(options::CONVENTIONAL).unwrap_or_default()); + +fn navigation_benchmark(c: &mut Criterion) { + fs::create_dir_all(PWD).unwrap(); (1..10000).for_each(|i| { - fs::File::create(format!("/tmp/xplr_bench/{}", i)).unwrap(); + fs::File::create(std::path::Path::new(PWD).join(i.to_string())).unwrap(); }); - let mut app = app::App::create("/tmp/xplr_bench".into()).expect("failed to create app"); + let mut app = app::App::create(PWD.into()).expect("failed to create app"); app = app .clone() .handle_task( app::Task::new( - app::MsgIn::External(app::ExternalMsg::ChangeDirectory("/tmp/xplr_bench".into())), + app::MsgIn::External(app::ExternalMsg::ChangeDirectory(PWD.into())), None, ), - &app.clone(), + &app, ) .unwrap(); @@ -26,7 +41,7 @@ fn criterion_benchmark(c: &mut Criterion) { app.clone() .handle_task( app::Task::new(app::MsgIn::External(app::ExternalMsg::FocusNext), None), - &app.clone(), + &app, ) .unwrap() }) @@ -37,7 +52,7 @@ fn criterion_benchmark(c: &mut Criterion) { app.clone() .handle_task( app::Task::new(app::MsgIn::External(app::ExternalMsg::FocusPrevious), None), - &app.clone(), + &app, ) .unwrap() }) @@ -48,7 +63,7 @@ fn criterion_benchmark(c: &mut Criterion) { app.clone() .handle_task( app::Task::new(app::MsgIn::External(app::ExternalMsg::FocusFirst), None), - &app.clone(), + &app, ) .unwrap() }) @@ -59,7 +74,7 @@ fn criterion_benchmark(c: &mut Criterion) { app.clone() .handle_task( app::Task::new(app::MsgIn::External(app::ExternalMsg::FocusLast), None), - &app.clone(), + &app, ) .unwrap() }) @@ -70,16 +85,73 @@ fn criterion_benchmark(c: &mut Criterion) { app.clone() .handle_task( app::Task::new(app::MsgIn::External(app::ExternalMsg::Back), None), - &app.clone(), + &app, ) .unwrap() .handle_task( app::Task::new(app::MsgIn::External(app::ExternalMsg::Enter), None), - &app.clone(), + &app, ) .unwrap() }) }); } -criterion_group!(benches, criterion_benchmark); + +fn draw_benchmark(c: &mut Criterion) { + fs::create_dir_all(PWD).unwrap(); + (1..10000).for_each(|i| { + fs::File::create(std::path::Path::new(PWD).join(i.to_string())).unwrap(); + }); + + let mut app = app::App::create(PWD.into()).expect("failed to create app"); + + app = app + .clone() + .handle_task(app::Task::new( + app::MsgIn::External(app::ExternalMsg::ChangeDirectory(PWD.into())), + None, + ), &app) + .unwrap(); + + let mut hb = Handlebars::new(); + hb.register_helper("humansize", Box::new(to_humansize)); + hb.register_template_string( + app::TEMPLATE_TABLE_ROW, + &app.config() + .general() + .table() + .row() + .cols() + .clone() + .unwrap_or_default() + .iter() + .map(|c| c.format().clone().unwrap_or_default()) + .collect::>() + .join("\t"), + ) + .unwrap(); + + term::enable_raw_mode().unwrap(); + let mut stdout = get_tty().unwrap(); + // let mut stdout = stdout.lock(); + execute!(stdout, term::EnterAlternateScreen).unwrap(); + // let stdout = MouseTerminal::from(stdout); + let backend = CrosstermBackend::new(stdout); + let mut terminal = Terminal::new(backend).unwrap(); + terminal.hide_cursor().unwrap(); + + c.bench_function("draw on terminal", |b| { + b.iter(|| { + terminal.draw(|f| ui::draw(f, &app, &hb)).unwrap(); + }) + }); + + terminal.clear().unwrap(); + terminal.set_cursor(0, 0).unwrap(); + execute!(terminal.backend_mut(), term::LeaveAlternateScreen).unwrap(); + term::disable_raw_mode().unwrap(); + terminal.show_cursor().unwrap(); +} + +criterion_group!(benches, navigation_benchmark, draw_benchmark); criterion_main!(benches);