use std::sync::{Arc, Mutex};
use criterion::{criterion_group, criterion_main, Criterion};
use hyperlight_common::flatbuffer_wrappers::function_types::{ParameterValue, ReturnType};
use hyperlight_host::func::HostFunction2;
use hyperlight_host::sandbox::{MultiUseSandbox, UninitializedSandbox};
use hyperlight_host::sandbox_state::sandbox::EvolvableSandbox;
use hyperlight_host::sandbox_state::transition::Noop;
use hyperlight_host::GuestBinary;
use hyperlight_testing::simple_guest_as_string;
fn create_uninit_sandbox() -> UninitializedSandbox {
let path = simple_guest_as_string().unwrap();
UninitializedSandbox::new(GuestBinary::FilePath(path), None, None, None).unwrap()
}
fn create_multiuse_sandbox() -> MultiUseSandbox {
create_uninit_sandbox().evolve(Noop::default()).unwrap()
}
fn guest_call_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("guest_functions");
group.bench_function("guest_call", |b| {
let mut call_ctx = create_multiuse_sandbox().new_call_context();
b.iter(|| {
call_ctx
.call(
"Echo",
ReturnType::Int,
Some(vec![ParameterValue::String("hello\n".to_string())]),
)
.unwrap()
});
});
group.bench_function("guest_call_with_reset", |b| {
let mut sandbox = create_multiuse_sandbox();
b.iter(|| {
sandbox
.call_guest_function_by_name(
"Echo",
ReturnType::Int,
Some(vec![ParameterValue::String("hello\n".to_string())]),
)
.unwrap()
});
});
group.bench_function("guest_call_with_call_to_host_function", |b| {
let mut uninitialized_sandbox = create_uninit_sandbox();
fn add(a: i32, b: i32) -> hyperlight_host::Result<i32> {
Ok(a + b)
}
let host_function = Arc::new(Mutex::new(add));
host_function
.register(&mut uninitialized_sandbox, "HostAdd")
.unwrap();
let multiuse_sandbox: MultiUseSandbox =
uninitialized_sandbox.evolve(Noop::default()).unwrap();
let mut call_ctx = multiuse_sandbox.new_call_context();
b.iter(|| {
call_ctx
.call(
"Add",
ReturnType::Int,
Some(vec![ParameterValue::Int(1), ParameterValue::Int(41)]),
)
.unwrap()
});
});
group.finish();
}
fn sandbox_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("sandboxes");
group.bench_function("create_uninitalized_sandbox", |b| {
b.iter_with_large_drop(create_uninit_sandbox);
});
group.bench_function("create_uninitialized_sandbox_and_drop", |b| {
b.iter(create_uninit_sandbox);
});
group.bench_function("create_sandbox", |b| {
b.iter_with_large_drop(create_multiuse_sandbox);
});
group.bench_function("create_sandbox_and_drop", |b| {
b.iter(create_multiuse_sandbox);
});
group.bench_function("create_sandbox_and_call_context", |b| {
b.iter_with_large_drop(|| create_multiuse_sandbox().new_call_context());
});
group.bench_function("create_sandbox_and_call_context_and_drop", |b| {
b.iter(|| create_multiuse_sandbox().new_call_context());
});
group.finish();
}
criterion_group! {
name = benches;
config = Criterion::default();
targets = guest_call_benchmark, sandbox_benchmark
}
criterion_main!(benches);