Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wizer/benches/regex.rs
2459 views
1
use criterion::{Criterion, criterion_group, criterion_main};
2
use std::cell::LazyCell;
3
use std::convert::TryFrom;
4
use std::pin::pin;
5
use std::process::Command;
6
use std::task::{Context, Poll, Waker};
7
use wasmtime_wasi::p1::WasiP1Ctx;
8
9
fn run_iter(linker: &wasmtime::Linker<WasiP1Ctx>, module: &wasmtime::Module) {
10
let wasi = wasmtime_wasi::WasiCtxBuilder::new().build_p1();
11
let mut store = wasmtime::Store::new(linker.engine(), wasi);
12
let instance = linker.instantiate(&mut store, module).unwrap();
13
14
let memory = instance.get_memory(&mut store, "memory").unwrap();
15
let data = memory.data_mut(&mut store);
16
let ptr = data.len() - 5;
17
data[ptr..].copy_from_slice(b"hello");
18
19
let run = instance
20
.get_typed_func::<(i32, i32), i32>(&mut store, "run")
21
.unwrap();
22
let result = run
23
.call(&mut store, (i32::try_from(ptr).unwrap(), 5))
24
.unwrap();
25
assert_eq!(result, 0);
26
}
27
28
fn bench_regex(c: &mut Criterion) {
29
let mut group = c.benchmark_group("regex");
30
31
let control = LazyCell::new(|| {
32
let status = Command::new("cargo")
33
.args(&["build", "--target", "wasm32-wasip1", "--release", "-q"])
34
.current_dir("./benches/regex-bench")
35
.status()
36
.unwrap();
37
assert!(status.success());
38
std::fs::read("../../target/wasm32-wasip1/release/regex_bench.wasm").unwrap()
39
});
40
41
group.bench_function("control", |b| {
42
let engine = wasmtime::Engine::default();
43
let module = wasmtime::Module::new(&engine, &*control).unwrap();
44
let mut linker = wasmtime::Linker::new(&engine);
45
wasmtime_wasi::p1::add_to_linker_sync(&mut linker, |s| s).unwrap();
46
47
b.iter(|| run_iter(&linker, &module));
48
});
49
50
group.bench_function("wizer", |b| {
51
let engine = wasmtime::Engine::default();
52
let mut linker = wasmtime::Linker::new(&engine);
53
wasmtime_wasi::p1::add_to_linker_sync(&mut linker, |s| s).unwrap();
54
55
let wasi = wasmtime_wasi::WasiCtxBuilder::new().build_p1();
56
let mut store = wasmtime::Store::new(linker.engine(), wasi);
57
let wizened = assert_ready(wasmtime_wizer::Wizer::new().run(
58
&mut store,
59
&control,
60
async |store, module| linker.instantiate(store, module),
61
))
62
.unwrap();
63
let module = wasmtime::Module::new(&engine, &wizened).unwrap();
64
b.iter(|| run_iter(&linker, &module));
65
});
66
group.finish();
67
}
68
69
fn assert_ready<F: Future>(f: F) -> F::Output {
70
let mut context = Context::from_waker(Waker::noop());
71
match pin!(f).poll(&mut context) {
72
Poll::Ready(ret) => ret,
73
Poll::Pending => panic!("future wasn't ready"),
74
}
75
}
76
77
criterion_group!(benches, bench_regex);
78
criterion_main!(benches);
79
80