From 41e7b2a10c844386edb3ead9abc87132be50214a Mon Sep 17 00:00:00 2001 From: Leo dev Date: Fri, 30 Jan 2026 15:08:01 +0100 Subject: [PATCH] Benchmarking --- examples/benchmark.rs | 26 +++++++++- examples/simple_benchmark.rs | 9 +++- src/engine/benchmark.rs | 44 ++++++++-------- src/engine/mod.rs | 2 - src/engine/simple_benchmark.rs | 93 ---------------------------------- 5 files changed, 53 insertions(+), 121 deletions(-) delete mode 100644 src/engine/simple_benchmark.rs diff --git a/examples/benchmark.rs b/examples/benchmark.rs index 6acd250..bbea75e 100644 --- a/examples/benchmark.rs +++ b/examples/benchmark.rs @@ -4,12 +4,34 @@ use osui::prelude::*; pub fn main() { let engine = Benchmark::new(Console::new()); - engine.run(app).expect("Failed to run engine"); + + let mut benchmark_result = Vec::new(); + + for flat in 0..10 { + // for nest in 0..10 { + benchmark_result.push( + engine + .run(move |cx| { + // let sync_nest = use_state(nest); + cx.scope().child(app, None); + // use_sync_effect(cx, &sync_nest, |s| s.get_dl(), &[&sync_nest]); + + rsx! { + app + } + .view(cx.clone()) + }) + .expect("Failed to run engine"), + ); + // } + } } fn app(cx: &Arc) -> View { + // let nest = use_sync_state(cx, 0, |v| *v); + rsx! { - "Hello, world!" + "hello_world" } .view(cx.clone()) } diff --git a/examples/simple_benchmark.rs b/examples/simple_benchmark.rs index 6927c9f..811120e 100644 --- a/examples/simple_benchmark.rs +++ b/examples/simple_benchmark.rs @@ -3,8 +3,13 @@ use std::sync::Arc; use osui::prelude::*; pub fn main() { - let engine = SimpleBenchmark::new(Console::new()); - engine.run(app).expect("Failed to run engine"); + let engine = Benchmark::new(Console::new()); + let benchmark_result = engine.run(app).expect("Failed to run engine"); + println!("Avg: {} μs", benchmark_result.average); + println!("Min: {} μs", benchmark_result.min); + println!("Max: {} μs", benchmark_result.max); + println!("Tot: {} μs", benchmark_result.total); + println!("Tot Render: {} μs", benchmark_result.total_render); } fn app(cx: &Arc) -> View { diff --git a/src/engine/benchmark.rs b/src/engine/benchmark.rs index 95487c1..da40612 100644 --- a/src/engine/benchmark.rs +++ b/src/engine/benchmark.rs @@ -6,6 +6,15 @@ use crate::{prelude::Context, render::Area, DrawContext, View}; use super::Engine; +#[derive(Debug, Clone)] +pub struct BenchmarkResult { + pub average: u128, + pub min: u128, + pub max: u128, + pub total_render: u128, + pub total: u128, +} + pub struct Benchmark(T); impl Benchmark { @@ -14,12 +23,12 @@ impl Benchmark { } } -impl Engine for Benchmark { +impl Engine for Benchmark { fn run) -> View + Send + Sync + 'static>( &self, component: F, - ) -> crate::Result<()> { - let mut times: Vec = Vec::new(); + ) -> crate::Result { + let mut times: Vec = Vec::new(); let cx = self.init(component); let start = Instant::now(); @@ -28,7 +37,7 @@ impl Engine for Benchmark { let start = Instant::now(); self.render(&cx); let end = Instant::now(); - times.push(end.duration_since(start).as_micros() as u64); + times.push(end.duration_since(start).as_micros()); self.0.render_delay(); } @@ -38,26 +47,17 @@ impl Engine for Benchmark { execute!(stdout(), Clear(crossterm::terminal::ClearType::All)).unwrap(); execute!(stdout(), MoveTo(0, 0)).unwrap(); - println!( - "Average time: {} µs", - if times.len() > 0 { - times.iter().sum::() / (times.len() as u64) + Ok(BenchmarkResult { + min: *times.iter().min().unwrap_or(&0), + max: *times.iter().max().unwrap_or(&0), + total: end.duration_since(start).as_micros(), + total_render: times.iter().sum::(), + average: if times.len() > 0 { + times.iter().sum::() / (times.len() as u128) } else { 0 - } - ); - println!("Min time: {} µs", times.iter().min().unwrap_or(&0)); - println!("Max time: {} µs", times.iter().max().unwrap_or(&0)); - println!("Total time: {} µs", end.duration_since(start).as_micros()); - println!("Total render time: {} µs", times.iter().sum::()); - println!( - "\n{},{},{}", - times.iter().min().unwrap_or(&0), - times.iter().max().unwrap_or(&0), - end.duration_since(start).as_micros() - ); - - Ok(()) + }, + }) } fn init) -> View + Send + Sync + 'static>( diff --git a/src/engine/mod.rs b/src/engine/mod.rs index 05d9f2d..b2f039f 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -1,11 +1,9 @@ pub mod benchmark; pub mod commands; pub mod console; -pub mod simple_benchmark; pub use benchmark::*; pub use console::*; -pub use simple_benchmark::*; use std::{any::Any, sync::Arc}; diff --git a/src/engine/simple_benchmark.rs b/src/engine/simple_benchmark.rs deleted file mode 100644 index 267fa9e..0000000 --- a/src/engine/simple_benchmark.rs +++ /dev/null @@ -1,93 +0,0 @@ -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, - ) -> crate::Result<()> { - 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::() - ); - - Ok(()) - } - - 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() - } -}