mod plugin_bench_helpers;
use criterion::{Criterion, black_box, criterion_group, criterion_main};
fn make_loaded_manager() -> (yosh::plugin::PluginManager, yosh::env::ShellEnv) {
let mut env = yosh::env::ShellEnv::new("yosh", Vec::new());
env.vars
.set("PERF_VAR", "perf_value")
.expect("set PERF_VAR");
let mut mgr = yosh::plugin::PluginManager::new();
yosh::plugin::test_helpers::load_plugin_with_caps(
&mut mgr,
&plugin_bench_helpers::perf_plugin_wasm(),
&mut env,
yosh_plugin_api::CAP_ALL,
&[],
)
.expect("load perf_plugin");
(mgr, env)
}
fn make_manager_with_n_plugins(n: usize) -> (yosh::plugin::PluginManager, yosh::env::ShellEnv) {
let mut env = yosh::env::ShellEnv::new("yosh", Vec::new());
let mut mgr = yosh::plugin::PluginManager::new();
let wasm = plugin_bench_helpers::perf_plugin_wasm();
for _ in 0..n {
yosh::plugin::test_helpers::load_plugin_with_caps(
&mut mgr,
&wasm,
&mut env,
yosh_plugin_api::CAP_ALL,
&[],
)
.expect("load perf_plugin");
}
(mgr, env)
}
fn bench_exec_noop_cmd(c: &mut Criterion) {
let (mut mgr, mut env) = make_loaded_manager();
let args: Vec<String> = vec![];
c.bench_function("plugin_exec_noop_cmd", |b| {
b.iter(|| {
let r = mgr.exec_command(&mut env, "noop_cmd", black_box(&args));
black_box(r);
});
});
}
fn bench_exec_noop_var(c: &mut Criterion) {
let (mut mgr, mut env) = make_loaded_manager();
let args: Vec<String> = vec![];
c.bench_function("plugin_exec_noop_var", |b| {
b.iter(|| {
let r = mgr.exec_command(&mut env, "noop_var", black_box(&args));
black_box(r);
});
});
}
fn bench_hook_pre_exec(c: &mut Criterion) {
let (mut mgr, mut env) = make_loaded_manager();
c.bench_function("plugin_hook_pre_exec", |b| {
b.iter(|| {
mgr.call_pre_exec(&mut env, black_box("noop"));
});
});
}
fn bench_pre_prompt_zero_plugins(c: &mut Criterion) {
let (mut mgr, mut env) = make_manager_with_n_plugins(0);
c.bench_function("plugin_pre_prompt_zero_plugins", |b| {
b.iter(|| {
mgr.call_pre_prompt(black_box(&mut env));
});
});
}
fn bench_pre_prompt_one_noop(c: &mut Criterion) {
let (mut mgr, mut env) = make_manager_with_n_plugins(1);
c.bench_function("plugin_pre_prompt_one_noop", |b| {
b.iter(|| {
mgr.call_pre_prompt(black_box(&mut env));
});
});
}
fn bench_pre_prompt_three_noop(c: &mut Criterion) {
let (mut mgr, mut env) = make_manager_with_n_plugins(3);
c.bench_function("plugin_pre_prompt_three_noop", |b| {
b.iter(|| {
mgr.call_pre_prompt(black_box(&mut env));
});
});
}
fn bench_exec_burst_var(c: &mut Criterion) {
let (mut mgr, mut env) = make_loaded_manager();
env.vars
.set("PERF_VAR", "perf_value")
.expect("set PERF_VAR");
let args: Vec<String> = vec![];
c.bench_function("plugin_exec_burst_var", |b| {
b.iter(|| {
let r = mgr.exec_command(&mut env, "burst_var", black_box(&args));
black_box(r);
});
});
}
fn bench_pre_exec_zero_plugins(c: &mut Criterion) {
let (mut mgr, mut env) = make_manager_with_n_plugins(0);
c.bench_function("plugin_pre_exec_zero_plugins", |b| {
b.iter(|| {
mgr.call_pre_exec(black_box(&mut env), "noop");
});
});
}
criterion_group!(
plugin_benches,
bench_exec_noop_cmd,
bench_exec_noop_var,
bench_exec_burst_var,
bench_hook_pre_exec,
bench_pre_exec_zero_plugins,
bench_pre_prompt_zero_plugins,
bench_pre_prompt_one_noop,
bench_pre_prompt_three_noop,
);
criterion_main!(plugin_benches);