From 74c4a976dd9f3663f698846609ab39c0784f3c66 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Thu, 29 Jan 2026 10:38:07 +0100 Subject: [PATCH] Separated simple benchmark --- examples/benchmark.rs | 2 +- examples/simple_benchmark.rs | 15 ++++++ src/engine/mod.rs | 4 +- src/engine/simple_benchmark.rs | 88 ++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 examples/simple_benchmark.rs create mode 100644 src/engine/simple_benchmark.rs diff --git a/examples/benchmark.rs b/examples/benchmark.rs index 4fc8e72..44ee985 100644 --- a/examples/benchmark.rs +++ b/examples/benchmark.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use osui::prelude::*; pub fn main() { - let engine = Benchmark::new(Console::new()); + let engine = SimpleBenchmark::new(Console::new()); engine.run(app); } diff --git a/examples/simple_benchmark.rs b/examples/simple_benchmark.rs new file mode 100644 index 0000000..44ee985 --- /dev/null +++ b/examples/simple_benchmark.rs @@ -0,0 +1,15 @@ +use std::sync::Arc; + +use osui::prelude::*; + +pub fn main() { + let engine = SimpleBenchmark::new(Console::new()); + engine.run(app); +} + +fn app(cx: &Arc) -> View { + rsx! { + "Hello, world!" + } + .view(cx.clone()) +} diff --git a/src/engine/mod.rs b/src/engine/mod.rs index bd28fb3..dd24824 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -1,8 +1,8 @@ -pub mod benchmark; +pub mod simple_benchmark; pub mod commands; pub mod console; -pub use benchmark::*; +pub use simple_benchmark::*; pub use console::*; use std::{any::Any, sync::Arc}; diff --git a/src/engine/simple_benchmark.rs b/src/engine/simple_benchmark.rs new file mode 100644 index 0000000..0893af4 --- /dev/null +++ b/src/engine/simple_benchmark.rs @@ -0,0 +1,88 @@ +use std::{io::stdout, sync::Arc, time::Instant}; + +use crossterm::{cursor::MoveTo, execute, terminal::Clear}; + +use crate::{prelude::Context, render::Area, DrawContext, View}; + +use super::Engine; + +pub struct SimpleBenchmark(T); + +impl SimpleBenchmark { + pub fn new(engine: T) -> Self { + Self(engine) + } +} + +impl Engine for SimpleBenchmark { + fn run) -> View + Send + Sync + 'static>(&self, component: F) { + let mut times: Vec = Vec::new(); + let cx = self.init(component); + + let start = Instant::now(); + + for _ in 0..100 { + let start = Instant::now(); + self.render(&cx); + let end = Instant::now(); + times.push(end.duration_since(start).as_nanos() as u64); + self.0.render_delay(); + } + + let end = Instant::now(); + + execute!(stdout(), Clear(crossterm::terminal::ClearType::Purge)).unwrap(); + execute!(stdout(), Clear(crossterm::terminal::ClearType::All)).unwrap(); + execute!(stdout(), MoveTo(0, 0)).unwrap(); + + println!( + "Average time: {} nanoseconds", + if times.len() > 0 { + times.iter().sum::() / (times.len() as u64) + } else { + 0 + } + ); + println!("Min time: {} nanoseconds", times.iter().min().unwrap_or(&0)); + println!("Max time: {} nanoseconds", times.iter().max().unwrap_or(&0)); + println!( + "Median time: {} nanoseconds", + times.iter().nth(times.len() / 2).unwrap_or(&0) + ); + println!( + "Total time: {} nanoseconds", + end.duration_since(start).as_nanos() + ); + println!( + "Total render time: {} nanoseconds", + times.iter().sum::() + ); + } + + fn init) -> View + Send + Sync + 'static>( + &self, + component: F, + ) -> Arc { + self.0.init(component) + } + + fn draw_context(&self, ctx: &DrawContext) { + self.0.draw_context(ctx) + } + + fn render(&self, cx: &Arc) { + self.0.render(cx) + } + + fn render_view(&self, area: &Area, view: &View) -> DrawContext { + self.0.render_view(area, view) + } + + fn render_delay(&self) { + self.0.render_delay(); + } + + fn executor(&self) -> Arc { + self.0.executor() + } +}