summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Cully <bjc@spork.org>2025-08-23 12:16:01 -0400
committerBrian Cully <bjc@spork.org>2025-08-23 12:16:01 -0400
commit8ce858ce7a03090b3b2a1310d17b1206f097637f (patch)
tree1cfffdd378abc49f4d1f737b76a83f76224a14c8
parent5b8962e35836cf7ccbfdbca312f6b0eb9269e2a6 (diff)
downloadautomathon-8ce858ce7a03090b3b2a1310d17b1206f097637f.tar.gz
automathon-8ce858ce7a03090b3b2a1310d17b1206f097637f.zip
add some benchmarking
-rw-r--r--main.mjs8
-rw-r--r--src/forth/interp.rs7
-rwxr-xr-xsrc/lib.rs20
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<usize, RuntimeError> {
+ 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<usize, String> {
+ 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<i32> {
+ let Some(interp) = &self.i else {
+ return vec![]
+ };
+
+ return interp.stack.0.clone()
}
pub fn wordlist(&self) -> Vec<ExportedByteCode> {
- let Some(interp) = self.i.as_ref() else {
+ let Some(interp) = &self.i else {
return vec![]
};