Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wizer/benches/uap.rs
2458 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()
11
.inherit_stdio()
12
.build_p1();
13
let mut store = wasmtime::Store::new(linker.engine(), wasi);
14
let instance = linker.instantiate(&mut store, module).unwrap();
15
16
let ua = "Mozilla/5.0 (X11; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0";
17
18
let alloc = instance
19
.get_typed_func::<(u32, u32), u32>(&mut store, "alloc")
20
.unwrap();
21
let ptr = alloc.call(&mut store, (ua.len() as u32, 1)).unwrap() as usize;
22
23
let memory = instance.get_memory(&mut store, "memory").unwrap();
24
let data = memory.data_mut(&mut store);
25
data[ptr..ptr + ua.len()].copy_from_slice(ua.as_bytes());
26
27
let run = instance
28
.get_typed_func::<(i32, i32), i32>(&mut store, "run")
29
.unwrap();
30
let result = run
31
.call(&mut store, (i32::try_from(ptr).unwrap(), 5))
32
.unwrap();
33
assert_eq!(result, 0);
34
35
let dealloc = instance
36
.get_typed_func::<(u32, u32, u32), ()>(&mut store, "dealloc")
37
.unwrap();
38
dealloc
39
.call(&mut store, (ptr as u32, ua.len() as u32, 1))
40
.unwrap();
41
}
42
43
fn bench_uap(c: &mut Criterion) {
44
let mut group = c.benchmark_group("uap");
45
46
let control_wasm = LazyCell::new(|| {
47
let status = Command::new("cargo")
48
.args(&["build", "--target", "wasm32-wasip1", "--release", "-q"])
49
.current_dir("./benches/uap-bench")
50
.status()
51
.unwrap();
52
assert!(status.success());
53
std::fs::read("../../target/wasm32-wasip1/release/uap_bench.wasm").unwrap()
54
});
55
let mut config = wasmtime::Config::new();
56
config.force_memory_init_memfd(true);
57
let engine = wasmtime::Engine::new(&config).unwrap();
58
let mut linker = wasmtime::Linker::new(&engine);
59
wasmtime_wasi::p1::add_to_linker_sync(&mut linker, |s| s).unwrap();
60
let control = LazyCell::new(|| wasmtime::Module::new(&engine, &*control_wasm).unwrap());
61
62
group.bench_function("control", |b| {
63
LazyCell::force(&control);
64
b.iter(|| run_iter(&linker, &control));
65
});
66
67
let wizer = LazyCell::new(|| {
68
let wasi = wasmtime_wasi::WasiCtxBuilder::new().build_p1();
69
let mut store = wasmtime::Store::new(linker.engine(), wasi);
70
let wizened = assert_ready(wasmtime_wizer::Wizer::new().run(
71
&mut store,
72
&control_wasm,
73
async |store, module| linker.instantiate(store, module),
74
))
75
.unwrap();
76
wasmtime::Module::new(&engine, &wizened).unwrap()
77
});
78
group.bench_function("wizer", |b| {
79
LazyCell::force(&wizer);
80
b.iter(|| run_iter(&linker, &wizer));
81
});
82
group.finish();
83
}
84
85
fn assert_ready<F: Future>(f: F) -> F::Output {
86
let mut context = Context::from_waker(Waker::noop());
87
match pin!(f).poll(&mut context) {
88
Poll::Ready(ret) => ret,
89
Poll::Pending => panic!("future wasn't ready"),
90
}
91
}
92
93
criterion_group!(benches, bench_uap);
94
criterion_main!(benches);
95
96