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> { 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);