use std::hint::black_box;
use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
use halfedge::{build_icosphere, loop_subdivide};
fn bench_loop_subdivide(c: &mut Criterion) {
let mut group = c.benchmark_group("subdiv/loop");
group.sample_size(10);
for n in 0..=3usize {
let mesh = build_icosphere(n);
let v_before = mesh.vertex_count();
let f_before = mesh.face_count();
let he_before = mesh.halfedge_count();
let check = loop_subdivide(&mesh);
let v_after = check.vertex_count();
let f_after = check.face_count();
println!(
"[loop_subdivide] icosphere({}): V={}→{}, F={}→{}, HE={}→{} (耗时见下表)",
n,
v_before,
v_after,
f_before,
f_after,
he_before,
check.halfedge_count()
);
assert_eq!(f_after, f_before * 4, "面数应精确 4 倍");
let expected_v = v_before + he_before / 2;
assert_eq!(v_after, expected_v, "顶点数应为 V + E");
group.bench_with_input(BenchmarkId::new("icosphere", n), &mesh, |b, mesh| {
b.iter(|| {
let result = loop_subdivide(mesh);
black_box(result);
});
});
}
group.finish();
}
criterion_group!(benches, bench_loop_subdivide);
criterion_main!(benches);