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 --- Cargo.toml | 4 +++- site/index.html | 2 +- src/lib.rs | 43 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bd6395a..c0df418 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,5 +18,7 @@ features = ["js"] version = "2.3" [dependencies.web-sys] -features = ["Document", "DocumentTimeline", "Element", "Event", "HtmlElement", "HtmlCanvasElement", "CanvasRenderingContext2d", "Node", "Window"] +features = ["CanvasRenderingContext2d", "Document", "DocumentTimeline", + "Element", "Event", "HtmlCanvasElement", "HtmlElement", "HtmlInputElement", + "Node", "Performance", "Window"] version = "0.3" diff --git a/site/index.html b/site/index.html index dd747c1..e978b31 100644 --- a/site/index.html +++ b/site/index.html @@ -22,7 +22,7 @@

bench

- +
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