Files
solidcraft/crates/engine/examples/sketch_target_bench.rs
T

54 lines
2.6 KiB
Rust

//! Matched command timings and analytic cursor-distance error for the reported four-bar.
#[path = "../tests/support/four_bar.rs"]
mod four_bar;
use four_bar::Result;
use serde_json::json;
use solidcraft_geom::Vec2;
use solidcraft_sketch::profiling::capture;
use std::{io::Write, time::Instant};
fn main() -> Result<()> {
let mut args = std::env::args().skip(1);
let path = args.next().ok_or("usage: sketch_target_bench OUTPUT.json [REPEATS]")?;
let repeats: usize = args.next().map(|v| v.parse()).transpose()?.unwrap_or(10);
if !(1..=100).contains(&repeats) {
return Err("repeats must be in 1..100".into());
}
let mut cases = Vec::new();
for target in [Vec2::new(-10.0, 8.0), Vec2::new(-10.0, -8.0), Vec2::new(20.0, 20.0), Vec2::new(20.0, 0.0), Vec2::new(-8.0, 6.0)] {
for events in [1, 16] {
let mut samples = Vec::new();
for i in 0..repeats + 2 {
let mut s = four_bar::session()?;
let from = four_bar::point(&s, "crank.end")?;
let side = four_bar::branch(&s)?;
let start = Instant::now();
let (result, profile) = capture(|| -> Result<()> {
for k in 1..=events {
let q = from + (target - from) * (k as f64 / events as f64);
let at = four_bar::point(&s, "crank.end")?;
s.execute("sketch.drag", &json!({"entity":"crank.end","from":[at.x,at.y],"to":[q.x,q.y],"live":true}))?;
}
Ok(())
});
let elapsed_ns = start.elapsed().as_nanos().min(u64::MAX as u128) as u64;
result?;
let actual = four_bar::point(&s, "crank.end")?;
let error = four_bar::length_error(&s)?;
if error > 1e-6 || four_bar::branch(&s)? != side {
return Err("length or branch violation".into());
}
if i >= 2 {
samples.push(json!({"elapsed_ns":elapsed_ns,"actual":[actual.x,actual.y],"length_error":error,"cursor_distance":actual.dist(target),"nearest_error":actual.dist(target*(10.0/target.len())),"profile":profile}));
}
}
cases.push(json!({"target":[target.x,target.y],"events":events,"samples":samples}));
}
}
let mut out = std::io::BufWriter::new(std::fs::File::create(path)?);
serde_json::to_writer_pretty(&mut out, &json!({"schema":"solidcraft/sketch-target-bench/1","repeats":repeats,"warmup":2,"cases":cases}))?;
writeln!(out)?;
out.flush()?;
Ok(())
}