tinywasm 0.9.0

A tiny WebAssembly interpreter
Documentation
use criterion::{Criterion, criterion_group, criterion_main};
use eyre::Result;
use tinywasm::{ModuleInstance, Store, types};
use types::Module;

const WASM: &[u8] = include_bytes!("../../../examples/rust/out/fibonacci.wasm");

fn fibonacci_parse() -> Result<Module> {
    let parser = tinywasm_parser::Parser::new();
    let data = parser.parse_module_bytes(WASM)?;
    Ok(data)
}

fn fibonacci_to_twasm(module: &Module) -> Result<Vec<u8>> {
    let twasm = module.serialize_twasm()?;
    Ok(twasm)
}

fn fibonacci_from_twasm(twasm: &[u8]) -> Result<Module> {
    Ok(Module::try_from_twasm(twasm)?)
}

fn fibonacci_run(module: Module, recursive: bool, n: i32) -> Result<()> {
    let mut store = Store::default();
    let instance = ModuleInstance::instantiate(&mut store, &module, None)?;
    let argon2 = instance.func::<i32, i32>(
        &store,
        match recursive {
            true => "fibonacci_recursive",
            false => "fibonacci",
        },
    )?;
    argon2.call(&mut store, n)?;
    Ok(())
}

fn criterion_benchmark(c: &mut Criterion) {
    let module = fibonacci_parse().expect("fibonacci_parse");
    let twasm = fibonacci_to_twasm(&module).expect("fibonacci_to_twasm");
    let mut group = c.benchmark_group("fibonacci");

    group.measurement_time(std::time::Duration::from_secs(2));
    group.bench_function("fibonacci_parse", |b| b.iter(fibonacci_parse));
    group.bench_function("fibonacci_to_twasm", |b| b.iter(|| fibonacci_to_twasm(&module)));
    group.bench_function("fibonacci_from_twasm", |b| b.iter(|| fibonacci_from_twasm(&twasm)));

    group.measurement_time(std::time::Duration::from_secs(10));
    group.bench_function("fibonacci_iterative_60", |b| b.iter(|| fibonacci_run(module.clone(), false, 60)));
    group.bench_function("fibonacci_recursive_26", |b| b.iter(|| fibonacci_run(module.clone(), true, 26)));
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);