diff options
| author | Henry Gressmann <mail@henrygressmann.de> | 2024-01-26 23:08:38 +0100 |
|---|---|---|
| committer | Henry Gressmann <mail@henrygressmann.de> | 2024-01-26 23:08:38 +0100 |
| commit | 893e72e93d1739ffa6b9d945a4f1e0ec525f782f (patch) | |
| tree | 1a6c1b1368eb5a733c40633bb9ef52dd9d850003 /benches | |
| parent | 1f6ac248e106f77dee20af26567c61b2a35b75ba (diff) | |
chore: benchmarking + major performance improvements (50%+ faster)
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
Diffstat (limited to 'benches')
| -rw-r--r-- | benches/selfhosted.rs | 38 | ||||
| -rw-r--r-- | benches/util/mod.rs | 6 |
2 files changed, 44 insertions, 0 deletions
diff --git a/benches/selfhosted.rs b/benches/selfhosted.rs new file mode 100644 index 0000000..700e3f6 --- /dev/null +++ b/benches/selfhosted.rs @@ -0,0 +1,38 @@ +mod util; +use criterion::{criterion_group, criterion_main, Criterion}; +use tinywasm::types::TinyWasmModule; +use util::tinywasm_module; + +fn run_tinywasm(module: TinyWasmModule) { + use tinywasm::*; + let module = Module::from(module); + let mut store = Store::default(); + let mut imports = Imports::default(); + imports.define("env", "printi32", Extern::typed_func(|_: FuncContext<'_>, _: i32| Ok(()))).expect("define"); + let instance = module.instantiate(&mut store, Some(imports)).expect("instantiate"); + let hello = instance.exported_func::<(), ()>(&mut store, "hello").expect("exported_func"); + hello.call(&mut store, ()).expect("call"); +} + +fn run_wasmi() { + use wasmi::*; + let engine = Engine::default(); + let module = wasmi::Module::new(&engine, TINYWASM).expect("wasmi::Module::new"); + let mut store = Store::new(&engine, ()); + let mut linker = <Linker<()>>::new(&engine); + linker.define("env", "printi32", Func::wrap(&mut store, |_: Caller<'_, ()>, _: i32| {})).expect("define"); + let instance = linker.instantiate(&mut store, &module).expect("instantiate").start(&mut store).expect("start"); + let hello = instance.get_typed_func::<(), ()>(&mut store, "hello").expect("get_typed_func"); + hello.call(&mut store, ()).expect("call"); +} + +const TINYWASM: &[u8] = include_bytes!("../examples/rust/out/tinywasm.wasm"); +fn criterion_benchmark(c: &mut Criterion) { + let module = tinywasm_module(TINYWASM); + + c.bench_function("tinywasm", |b| b.iter(|| run_tinywasm(module.clone()))); + c.bench_function("wasmi", |b| b.iter(|| run_wasmi())); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/benches/util/mod.rs b/benches/util/mod.rs new file mode 100644 index 0000000..7baddb7 --- /dev/null +++ b/benches/util/mod.rs @@ -0,0 +1,6 @@ +use tinywasm::{self, parser::Parser, types::TinyWasmModule}; + +pub fn tinywasm_module(wasm: &[u8]) -> TinyWasmModule { + let parser = Parser::new(); + parser.parse_module_bytes(wasm).expect("parse_module_bytes") +} |
