nigig-org/crates/apps/nigig-traffic/tests/perf_release.rs
andodeki 5aac7e3920
Some checks failed
repo hygiene / hygiene (push) Has been cancelled
traffic / gates (push) Has been cancelled
traffic / nigig-traffic (push) Has been cancelled
traffic / supply-chain (push) Has been cancelled
nigig-site / Owned paths and honest test contracts (push) Has been cancelled
nigig-site / Cargo check-all-targets (push) Has been cancelled
nigig-site / Cargo clippy-site-owned (push) Has been cancelled
nigig-site / Cargo contained-media-export-fixtures (push) Has been cancelled
nigig-site / Cargo containment-storage-crypto (push) Has been cancelled
nigig-site / Cargo core-clippy (push) Has been cancelled
nigig-site / Cargo core-contracts (push) Has been cancelled
nigig-site / Cargo integration-non-live (push) Has been cancelled
nigig-site / Cargo production-dependency-containment (push) Has been cancelled
nigig-site / Cargo site02-crypto (push) Has been cancelled
nigig-site / Cargo site02-repository (push) Has been cancelled
nigig-site / Cargo site02-store (push) Has been cancelled
nigig-site / Cargo unit (push) Has been cancelled
nigig-site / SITE-02 native provider/filesystem (macos-latest) (push) Has been cancelled
nigig-site / SITE-02 native provider/filesystem (ubuntu-latest) (push) Has been cancelled
nigig-site / SITE-02 native provider/filesystem (windows-latest) (push) Has been cancelled
nigig-site / SITE-02 desktop runtime and normal shutdown (push) Has been cancelled
nigig-site / SITE-02 migration, recovery, and fault corpus (push) Has been cancelled
nigig-site / Media limits (explicitly skipped until enabled) (push) Has been cancelled
nigig-site / Real server interoperability (explicitly skipped until enabled) (push) Has been cancelled
nigig-site / Security and supply-chain baseline (push) Has been cancelled
nigig-site / Release capability gate (push) Has been cancelled
cad / cad-truth-gates (push) Has been cancelled
cad / cad-core-checks (push) Has been cancelled
cad / cad-consumers (push) Has been cancelled
doc-engine / engine (push) Has been cancelled
doc-engine / coverage (push) Has been cancelled
doc-engine / consumer (push) Has been cancelled
email / gates (push) Has been cancelled
email / email-domain (push) Has been cancelled
email / nigig-email (push) Has been cancelled
email / supply-chain (push) Has been cancelled
nigig-build (CAD) / supply-chain (push) Has been cancelled
nigig-build (CAD) / cad-module (push) Has been cancelled
nigig-build (CAD) / full-crate-check (push) Has been cancelled
nigig-build (CAD) / cad-engine-coverage (push) Has been cancelled
nigig-build (CAD) / doc-workspace-coverage (push) Has been cancelled
nigig-build (CAD) / cad-widget-coverage (push) Has been cancelled
nigig-map / test (push) Has been cancelled
sms / gates (push) Has been cancelled
sms / robius-sms (push) Has been cancelled
sms / android (push) Has been cancelled
sms / nigig-sms (push) Has been cancelled
sms / supply-chain (push) Has been cancelled
spreadsheet / engine-coverage (push) Has been cancelled
spreadsheet / ui-controller-coverage (push) Has been cancelled
fix(nigig-traffic): TRAFFIC-01 close P0-01 — coherent Makepad pin, green build/tests
- Re-pin workspace makepad b580de1 -> a3d8f521 (fork branch
  nigig-traffic-camera-boom-fix: 5-arg camera_boom_limit callers +
  EntityLocal particle anchor port). Cargo.lock updated atomically.
- Fix Walk literal broken by upstream fields (scenarios.rs).
- First executed test run: reword two completion strings that tripped
  the banned-claim gate (gate unchanged).
- Zero Traffic-owned compiler/clippy diagnostics; cargo fmt.
- Docs: plan status + release gates, IMPLEMENTATION_STATUS round 3.

Verified: check --all-targets clean; test 117 pass / 0 fail / 4 ignored
(GUI); clippy 0 owned diagnostics; fmt; diff --check.
2026-09-26 13:06:50 +00:00

90 lines
3.2 KiB
Rust

//! Active-workload performance evidence (TRAFFIC-15).
//!
//! Deterministic ACTIVE workload — steering, braking, traffic, rule
//! transitions, score updates — over the worst validated scenario, plus
//! structural budget asserts (entity/event caps) that hold in ANY profile.
//! Wall-clock numbers are REPORTED, never asserted: debug, idle, CPU-only,
//! or no-GPU timings are diagnostic, never a release pass. Release budgets
//! (§6) pass only from `cargo ... --release` runs on declared hardware
//! with actual rendering/GPU; see `docs/PERF_BASELINE.md`.
//!
//! ```sh
//! cargo test --locked -p nigig-traffic --test perf_release -- --test-threads=1 --nocapture
//! ```
use nigig_traffic::traffic::{TrafficWorld, TICK_DT};
use std::time::Instant;
fn percentile(mut v: Vec<u128>, p: f64) -> u128 {
v.sort_unstable();
v[((p * v.len() as f64) as usize).min(v.len().saturating_sub(1))]
}
#[test]
fn active_workload_reports_and_structural_budgets_hold() {
// Worst validated scenario: most entities + a moving hazard.
let scenarios = TrafficWorld::all_scenarios();
let mut worst = 0usize;
let mut worst_ents = 0usize;
for (i, _) in scenarios.iter().enumerate() {
let mut w = TrafficWorld::new();
w.load_scenario(i);
let n = w.sim.world.entities.len();
if n > worst_ents {
worst_ents = n;
worst = i;
}
}
println!(
"worst-content scenario: {} ({worst_ents} entities)",
scenarios[worst].id
);
// Structural budgets (§6) hold in every profile.
assert!(worst_ents <= 256, "entity budget: {worst_ents}");
const { assert!(TICK_DT > 0.0) };
// Active workload: 60 s of scripted driving with steering reversals,
// braking zones, and full-lock turns (rule transitions + score path).
let mut w = TrafficWorld::new();
w.load_scenario(worst);
// Skip intro for a pure Active measurement.
for _ in 0..60 {
w.tick(&makepad_game_blocks::DriveInput::default());
}
let mut samples = Vec::with_capacity(3600);
let mut inputs = 0u64;
for i in 0..3600u64 {
let phase = (i / 600) % 4;
let input = makepad_game_blocks::DriveInput {
steer: match phase {
0 => 0.6,
1 => -0.6,
2 => 1.0,
_ => -1.0,
},
throttle: if i % 900 < 700 { 0.8 } else { 0.0 },
brake: if i % 900 >= 700 { 0.8 } else { 0.0 },
..makepad_game_blocks::DriveInput::default()
};
let t0 = Instant::now();
w.tick(&input);
samples.push(t0.elapsed().as_nanos());
inputs += 1;
}
assert_eq!(inputs, 3600);
// The sim really ran: ticks advanced and the verdict histogram is live.
assert_eq!(w.run.tick, 3660);
let counts = w.verdict_counts();
assert!(counts.iter().sum::<u64>() > 0);
let p50 = percentile(samples.clone(), 0.50);
let p95 = percentile(samples.clone(), 0.95);
let p99 = percentile(samples, 0.99);
println!(
"active tick ns p50={p50} p95={p95} p99={p99} (n=3600, profile-dependent, diagnostic only)"
);
println!("verdict histogram: {counts:?}");
println!(
"score: {}/{}",
w.run.score.total_points, w.run.score.max_points
);
}