112 lines
3.2 KiB
Rust
112 lines
3.2 KiB
Rust
use criterion::{Criterion, criterion_group, criterion_main};
|
|
use std::hint::black_box;
|
|
use std::process;
|
|
use tokio::runtime::Runtime;
|
|
|
|
use app_lib::config::IVerge;
|
|
use app_lib::utils::Draft as DraftNew;
|
|
|
|
/// 创建测试数据
|
|
fn make_draft() -> DraftNew<Box<IVerge>> {
|
|
let verge = Box::new(IVerge {
|
|
enable_auto_launch: Some(true),
|
|
enable_tun_mode: Some(false),
|
|
..Default::default()
|
|
});
|
|
DraftNew::from(verge)
|
|
}
|
|
|
|
pub fn bench_draft(c: &mut Criterion) {
|
|
let rt = Runtime::new().unwrap_or_else(|e| {
|
|
eprintln!("Tokio runtime init failed: {e}");
|
|
process::exit(1);
|
|
});
|
|
|
|
let mut group = c.benchmark_group("draft");
|
|
group.sample_size(100);
|
|
group.warm_up_time(std::time::Duration::from_millis(300));
|
|
group.measurement_time(std::time::Duration::from_secs(1));
|
|
|
|
group.bench_function("data_mut", |b| {
|
|
b.iter(|| {
|
|
let draft = black_box(make_draft());
|
|
let mut data = draft.data_mut();
|
|
data.enable_tun_mode = Some(true);
|
|
black_box(&data.enable_tun_mode);
|
|
});
|
|
});
|
|
|
|
group.bench_function("draft_mut_first", |b| {
|
|
b.iter(|| {
|
|
let draft = black_box(make_draft());
|
|
let mut d = draft.draft_mut();
|
|
d.enable_auto_launch = Some(false);
|
|
black_box(&d.enable_auto_launch);
|
|
});
|
|
});
|
|
|
|
group.bench_function("draft_mut_existing", |b| {
|
|
b.iter(|| {
|
|
let draft = black_box(make_draft());
|
|
{
|
|
let mut first = draft.draft_mut();
|
|
first.enable_tun_mode = Some(true);
|
|
black_box(&first.enable_tun_mode);
|
|
}
|
|
let mut second = draft.draft_mut();
|
|
second.enable_tun_mode = Some(false);
|
|
black_box(&second.enable_tun_mode);
|
|
});
|
|
});
|
|
|
|
group.bench_function("latest_ref", |b| {
|
|
b.iter(|| {
|
|
let draft = black_box(make_draft());
|
|
let latest = draft.latest_ref();
|
|
black_box(&latest.enable_auto_launch);
|
|
});
|
|
});
|
|
|
|
group.bench_function("apply", |b| {
|
|
b.iter(|| {
|
|
let draft = black_box(make_draft());
|
|
{
|
|
let mut d = draft.draft_mut();
|
|
d.enable_auto_launch = Some(false);
|
|
}
|
|
draft.apply();
|
|
black_box(&draft);
|
|
});
|
|
});
|
|
|
|
group.bench_function("discard", |b| {
|
|
b.iter(|| {
|
|
let draft = black_box(make_draft());
|
|
{
|
|
let mut d = draft.draft_mut();
|
|
d.enable_auto_launch = Some(false);
|
|
}
|
|
draft.discard();
|
|
black_box(&draft);
|
|
});
|
|
});
|
|
|
|
group.bench_function("with_data_modify_async", |b| {
|
|
b.to_async(&rt).iter(|| async {
|
|
let draft = black_box(make_draft());
|
|
let _: Result<(), anyhow::Error> = draft
|
|
.with_data_modify::<_, _, _, anyhow::Error>(|mut box_data| async move {
|
|
box_data.enable_auto_launch =
|
|
Some(!box_data.enable_auto_launch.unwrap_or(false));
|
|
Ok((box_data, ()))
|
|
})
|
|
.await;
|
|
});
|
|
});
|
|
|
|
group.finish();
|
|
}
|
|
|
|
criterion_group!(benches, bench_draft);
|
|
criterion_main!(benches);
|