refactor: update draft handling and improve benchmark structure
This commit is contained in:
@@ -3,7 +3,6 @@ use std::hint::black_box;
|
||||
use std::process;
|
||||
use tokio::runtime::Runtime;
|
||||
|
||||
// 引入业务模型 & Draft 实现
|
||||
use app_lib::config::IVerge;
|
||||
use app_lib::utils::Draft as DraftNew;
|
||||
|
||||
@@ -17,108 +16,86 @@ fn make_draft() -> DraftNew<Box<IVerge>> {
|
||||
DraftNew::from(verge)
|
||||
}
|
||||
|
||||
/// 基准:只读 data_ref(正式数据)
|
||||
fn bench_data_ref(c: &mut Criterion) {
|
||||
c.bench_function("draft_data_ref", |b| {
|
||||
b.iter(|| {
|
||||
let draft = make_draft();
|
||||
let data = draft.data_ref();
|
||||
black_box(data.enable_auto_launch);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/// 基准:可写 data_mut(正式数据)
|
||||
fn bench_data_mut(c: &mut Criterion) {
|
||||
c.bench_function("draft_data_mut", |b| {
|
||||
b.iter(|| {
|
||||
let draft = make_draft();
|
||||
let mut data = draft.data_mut();
|
||||
data.enable_tun_mode = Some(true);
|
||||
black_box(data.enable_tun_mode);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/// 基准:首次创建草稿(会触发 clone)
|
||||
fn bench_draft_mut_first(c: &mut Criterion) {
|
||||
c.bench_function("draft_draft_mut_first", |b| {
|
||||
b.iter(|| {
|
||||
let draft = make_draft();
|
||||
let mut d = draft.draft_mut();
|
||||
d.enable_auto_launch = Some(false);
|
||||
black_box(d.enable_auto_launch);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/// 基准:重复 draft_mut(已存在草稿,不再 clone)
|
||||
fn bench_draft_mut_existing(c: &mut Criterion) {
|
||||
c.bench_function("draft_draft_mut_existing", |b| {
|
||||
b.iter(|| {
|
||||
let draft = make_draft();
|
||||
{
|
||||
let mut first = draft.draft_mut();
|
||||
first.enable_tun_mode = Some(true);
|
||||
}
|
||||
let mut second = draft.draft_mut();
|
||||
second.enable_tun_mode = Some(false);
|
||||
black_box(second.enable_tun_mode);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/// 基准:零拷贝读取最新视图(latest_ref)
|
||||
fn bench_latest_ref(c: &mut Criterion) {
|
||||
c.bench_function("draft_latest_ref", |b| {
|
||||
b.iter(|| {
|
||||
let draft = make_draft();
|
||||
let latest = draft.latest_ref();
|
||||
black_box(latest.enable_auto_launch);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/// 基准:apply(提交草稿)
|
||||
fn bench_apply(c: &mut Criterion) {
|
||||
c.bench_function("draft_apply", |b| {
|
||||
b.iter(|| {
|
||||
let draft = make_draft();
|
||||
{
|
||||
let mut d = draft.draft_mut();
|
||||
d.enable_auto_launch = Some(false);
|
||||
}
|
||||
let _ = draft.apply();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/// 基准:discard(丢弃草稿)
|
||||
fn bench_discard(c: &mut Criterion) {
|
||||
c.bench_function("draft_discard", |b| {
|
||||
b.iter(|| {
|
||||
let draft = make_draft();
|
||||
{
|
||||
let mut d = draft.draft_mut();
|
||||
d.enable_auto_launch = Some(false);
|
||||
}
|
||||
let _ = draft.discard();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/// 基准:异步 with_data_modify
|
||||
fn bench_with_data_modify(c: &mut Criterion) {
|
||||
let rt = Runtime::new().unwrap_or_else(|error| {
|
||||
eprintln!("draft benchmarks require a Tokio runtime: {error}");
|
||||
pub fn bench_draft(c: &mut Criterion) {
|
||||
let rt = Runtime::new().unwrap_or_else(|e| {
|
||||
eprintln!("Tokio runtime init failed: {e}");
|
||||
process::exit(1);
|
||||
});
|
||||
|
||||
c.bench_function("draft_with_data_modify", |b| {
|
||||
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 = make_draft();
|
||||
let _res: Result<(), anyhow::Error> = draft
|
||||
.with_data_modify(|mut box_data| async move {
|
||||
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, ()))
|
||||
@@ -126,17 +103,9 @@ fn bench_with_data_modify(c: &mut Criterion) {
|
||||
.await;
|
||||
});
|
||||
});
|
||||
|
||||
group.finish();
|
||||
}
|
||||
|
||||
criterion_group!(
|
||||
benches,
|
||||
bench_data_ref,
|
||||
bench_data_mut,
|
||||
bench_draft_mut_first,
|
||||
bench_draft_mut_existing,
|
||||
bench_latest_ref,
|
||||
bench_apply,
|
||||
bench_discard,
|
||||
bench_with_data_modify
|
||||
);
|
||||
criterion_group!(benches, bench_draft);
|
||||
criterion_main!(benches);
|
||||
|
||||
Reference in New Issue
Block a user