diff options
| author | brian cully <bjc@spork.org> | 2025-12-29 12:19:06 -0500 |
|---|---|---|
| committer | brian cully <bjc@spork.org> | 2025-12-29 12:19:06 -0500 |
| commit | 33ff3488f89b3e89ed31780ff7ab72128abe5312 (patch) | |
| tree | 97296d91db223fb46482d907b1867872505415f5 /src | |
| parent | 8197bb1657d2f8ded4aec30ddff2b7df2a13a23a (diff) | |
| download | polyring-33ff3488f89b3e89ed31780ff7ab72128abe5312.tar.gz polyring-33ff3488f89b3e89ed31780ff7ab72128abe5312.zip | |
wasm: add benchmarking
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 43 |
1 files changed, 39 insertions, 4 deletions
@@ -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<web_sys::HtmlCanvasElement> { let x = document().query_selector("section.watch canvas")?.ok_or("no canvas")?; - Ok(x.dyn_into::<web_sys::HtmlCanvasElement>()?) + Ok(x.dyn_into()?) } fn fps() -> JSResult<web_sys::HtmlElement> { let x = document().query_selector("section.watch .fps")?.ok_or("no fps counter")?; - Ok(x.dyn_into::<web_sys::HtmlElement>()?) + Ok(x.dyn_into()?) } fn go() -> JSResult<web_sys::HtmlElement> { let x = document().query_selector("section.watch button")?.ok_or("no go button")?; - Ok(x.dyn_into::<web_sys::HtmlElement>()?) + Ok(x.dyn_into()?) +} + +fn iters() -> JSResult<web_sys::HtmlInputElement> { + let x = document().query_selector("section.bench input")?.ok_or("no go button")?; + Ok(x.dyn_into()?) +} + +fn bench() -> JSResult<web_sys::HtmlElement> { + 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::<u32>().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::<f64>::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(()) } |
