Path: blob/main/crates/wizer/benches/regex.rs
2459 views
use criterion::{Criterion, criterion_group, criterion_main};1use std::cell::LazyCell;2use std::convert::TryFrom;3use std::pin::pin;4use std::process::Command;5use std::task::{Context, Poll, Waker};6use wasmtime_wasi::p1::WasiP1Ctx;78fn run_iter(linker: &wasmtime::Linker<WasiP1Ctx>, module: &wasmtime::Module) {9let wasi = wasmtime_wasi::WasiCtxBuilder::new().build_p1();10let mut store = wasmtime::Store::new(linker.engine(), wasi);11let instance = linker.instantiate(&mut store, module).unwrap();1213let memory = instance.get_memory(&mut store, "memory").unwrap();14let data = memory.data_mut(&mut store);15let ptr = data.len() - 5;16data[ptr..].copy_from_slice(b"hello");1718let run = instance19.get_typed_func::<(i32, i32), i32>(&mut store, "run")20.unwrap();21let result = run22.call(&mut store, (i32::try_from(ptr).unwrap(), 5))23.unwrap();24assert_eq!(result, 0);25}2627fn bench_regex(c: &mut Criterion) {28let mut group = c.benchmark_group("regex");2930let control = LazyCell::new(|| {31let status = Command::new("cargo")32.args(&["build", "--target", "wasm32-wasip1", "--release", "-q"])33.current_dir("./benches/regex-bench")34.status()35.unwrap();36assert!(status.success());37std::fs::read("../../target/wasm32-wasip1/release/regex_bench.wasm").unwrap()38});3940group.bench_function("control", |b| {41let engine = wasmtime::Engine::default();42let module = wasmtime::Module::new(&engine, &*control).unwrap();43let mut linker = wasmtime::Linker::new(&engine);44wasmtime_wasi::p1::add_to_linker_sync(&mut linker, |s| s).unwrap();4546b.iter(|| run_iter(&linker, &module));47});4849group.bench_function("wizer", |b| {50let engine = wasmtime::Engine::default();51let mut linker = wasmtime::Linker::new(&engine);52wasmtime_wasi::p1::add_to_linker_sync(&mut linker, |s| s).unwrap();5354let wasi = wasmtime_wasi::WasiCtxBuilder::new().build_p1();55let mut store = wasmtime::Store::new(linker.engine(), wasi);56let wizened = assert_ready(wasmtime_wizer::Wizer::new().run(57&mut store,58&control,59async |store, module| linker.instantiate(store, module),60))61.unwrap();62let module = wasmtime::Module::new(&engine, &wizened).unwrap();63b.iter(|| run_iter(&linker, &module));64});65group.finish();66}6768fn assert_ready<F: Future>(f: F) -> F::Output {69let mut context = Context::from_waker(Waker::noop());70match pin!(f).poll(&mut context) {71Poll::Ready(ret) => ret,72Poll::Pending => panic!("future wasn't ready"),73}74}7576criterion_group!(benches, bench_regex);77criterion_main!(benches);787980