summaryrefslogtreecommitdiff
path: root/benches
diff options
context:
space:
mode:
Diffstat (limited to 'benches')
-rw-r--r--benches/selfhosted.rs38
-rw-r--r--benches/util/mod.rs6
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")
+}