From 33ff3488f89b3e89ed31780ff7ab72128abe5312 Mon Sep 17 00:00:00 2001 From: brian cully Date: Mon, 29 Dec 2025 12:19:06 -0500 Subject: wasm: add benchmarking --- src/lib.rs | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 7dd08e9..60fdc0f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -use std::rc::Rc; +use std::{cell::RefCell, rc::Rc}; use std::sync::Mutex; use log::{Level, debug, info}; @@ -26,17 +26,27 @@ fn document() -> web_sys::Document { fn canvas() -> JSResult { let x = document().query_selector("section.watch canvas")?.ok_or("no canvas")?; - Ok(x.dyn_into::()?) + Ok(x.dyn_into()?) } fn fps() -> JSResult { let x = document().query_selector("section.watch .fps")?.ok_or("no fps counter")?; - Ok(x.dyn_into::()?) + Ok(x.dyn_into()?) } fn go() -> JSResult { let x = document().query_selector("section.watch button")?.ok_or("no go button")?; - Ok(x.dyn_into::()?) + Ok(x.dyn_into()?) +} + +fn iters() -> JSResult { + let x = document().query_selector("section.bench input")?.ok_or("no go button")?; + Ok(x.dyn_into()?) +} + +fn bench() -> JSResult { + let x = document().query_selector("section.bench button")?.ok_or("no go button")?; + Ok(x.dyn_into()?) } #[wasm_bindgen(start)] @@ -51,7 +61,11 @@ pub fn init() -> JSResult<()> { let mut s = State::new(canvas()?, fps()?)?; s.render_frame(0.0)?; + let shared_s = Rc::new(RefCell::new(s)); + let s1 = shared_s.clone(); + let render_loop = RenderLoop::new(move |t| { + let mut s = shared_s.borrow_mut(); s.update()?; s.render_frame(t)?; Ok(!*paused.lock().unwrap()) @@ -75,5 +89,26 @@ pub fn init() -> JSResult<()> { // handler. go_handler.forget(); + let bench_handler: HandlerClosure = Closure::new(move |e| { + debug!("bench clicked {:?}", e); + let iters = iters()?.value().parse::().map_err(|_| "iters isn't int")?; + + let mut s = s1.borrow_mut(); + let perf = window().performance().unwrap(); + let start = perf.now(); + for _ in 0..iters { + s.update()?; + } + let end = perf.now(); + let delta = end - start; + let iters_per_ms = Into::::into(iters) / delta; + + info!("bench done. {iters} iters in {delta} ms ({iters_per_ms} iters per ms)"); + Ok(()) + }); + bench()?.set_onclick(Some(bench_handler.as_ref().unchecked_ref())); + // ibid. + bench_handler.forget(); + Ok(()) } -- cgit v1.3