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
- 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.
90 lines
3.2 KiB
Rust
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
|
|
);
|
|
}
|