From 8ce858ce7a03090b3b2a1310d17b1206f097637f Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Sat, 23 Aug 2025 12:16:01 -0400 Subject: add some benchmarking --- main.mjs | 8 ++++++++ src/forth/interp.rs | 7 ++++--- src/lib.rs | 20 +++++++++++++++++--- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/main.mjs b/main.mjs index 908aaa2..bcb7f0a 100644 --- a/main.mjs +++ b/main.mjs @@ -46,6 +46,14 @@ async function loaded() { }; document.querySelector('#run').onclick = e => { console.debug('run clicked', e); + const start = performance.now(); + let tickCount = 0; + for (let i = 0; i < 1_000_000; i++) { + tickCount += interp.run(); + } + const end = performance.now(); + console.info(`run took ${end-start} ms for ${tickCount} ticks (${(end-start)/tickCount * 1000000} µs/tick).`); + console.info('result', interp.stack()); }; window.interp = interp; } diff --git a/src/forth/interp.rs b/src/forth/interp.rs index e41f0d9..512c022 100644 --- a/src/forth/interp.rs +++ b/src/forth/interp.rs @@ -216,9 +216,10 @@ impl Interp { Ok(self.ip.offset < self.wordlist.0[self.ip.word].len()) } - pub fn run(&mut self) -> Result<(), RuntimeError> { - while self.tick()? {} - Ok(()) + pub fn run(&mut self) -> Result { + let mut count = 0; + while self.tick()? { count += 1 } + Ok(count) } } diff --git a/src/lib.rs b/src/lib.rs index 588f873..32a8ffc 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -71,12 +71,26 @@ impl ExportedInterp { info!("executing single instruction"); } - pub fn run(&mut self) { - info!("running to completion"); + pub fn run(&mut self) -> Result { + let Some(interp) = &mut self.i else { + return Err("no interpreter".to_string()) + }; + + interp.ip.word = 0; + interp.ip.offset = 0; + interp.run().or_else(|err| Err(format!("runtime error: {:?}", err))) + } + + pub fn stack(&self) -> Vec { + let Some(interp) = &self.i else { + return vec![] + }; + + return interp.stack.0.clone() } pub fn wordlist(&self) -> Vec { - let Some(interp) = self.i.as_ref() else { + let Some(interp) = &self.i else { return vec![] }; -- cgit v1.3