From 963d443b1c5ab66ca99b583626f1362decf5d003 Mon Sep 17 00:00:00 2001 From: Ruixiang Du Date: Sat, 11 Jul 2026 21:44:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?docs:=20I5=20evidence=20=E2=80=94=20observe?= =?UTF-8?q?r=20A/B=20tail-clean=20with=20rasterizer=20contention=20control?= =?UTF-8?q?led?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LP_NUM_THREADS=2 rerun isolates the llvmpipe confound: p99 identical (65.9us noop vs 65.7us attached), p99.9 +12% — no tail coupling through the ingestion boundary; the original p99.9 blow-up was core competition, as diagnosed. Residual p50 shift is powersave wake-up noise (<1% of the 1kHz period). Hardware-GL run remains the final pin, downgraded from open question to confirmation. --- docs/ingestion_contract.md | 4 +- imgui.ini | 37 +++++++++++++++++++ ingestion_bench_report.json | 23 ++++++++++++ obs_lp2.json | 9 +++++ ...11_i7-8700_xvfb-llvmpipe-lp2-observer.json | 9 +++++ 5 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 imgui.ini create mode 100644 ingestion_bench_report.json create mode 100644 obs_lp2.json create mode 100644 tests/benchmarks/ingestion/results/2026-07-11_i7-8700_xvfb-llvmpipe-lp2-observer.json diff --git a/docs/ingestion_contract.md b/docs/ingestion_contract.md index 8fcc99d..576c1f1 100644 --- a/docs/ingestion_contract.md +++ b/docs/ingestion_contract.md @@ -86,7 +86,7 @@ Reference hardware: i7-8700 (12 threads), `powersave` governor, Linux 5.15.0-185 | I2 alloc-free | **partial** | Zero allocations on every gated row (probe). Gap: no API to pre-size `DoubleBuffer`/`DataStream` slots for heap-owning payloads, so alloc-freedom for e.g. point clouds rests on application discipline, not a library guarantee. | | I3 never blocks + counted overflow | **partial** | Never-blocks: proven — with the render thread stalled to ~1 fps, 100 kHz producer p99 = 84 ns (vs 126 ns at 60 fps, 176 ns headless). Gap (**principal**): drop-oldest, write-refusal, and latest-only overwrite are all silent and uncounted — no counter exists anywhere in `core/buffer`. Silent-loss violates the family's observability rule. | | I4 render-rate independence | **conforms** | Spin-paced 100 kHz scalar p50/p99: headless 31/176 ns, 60 fps 76/126 ns, stalled 40/84 ns — invariant within noise, all within budget. | -| I5 observer invisibility | **partial (not proven on reference host)** | 1 kHz loop period jitter, no-op headless vs ingestion+60 fps rendering attached: p99 68 µs → 78 µs (+15%), but p50 1.0 µs → 7.6 µs and p99.9 115 µs → 991 µs. The degradation is CPU contention from **llvmpipe software rasterization** occupying cores (the paced I4 rows prove the ingestion boundary itself is mode-invariant at tens of ns), not boundary coupling — but the contract judges end-to-end invisibility, and on this host it does not hold. Must be re-proven on a hardware-GL host (and ideally a pinned-core / performance-governor setup) before the invisibility claim is made. | +| I5 observer invisibility | **tail-clean under controlled contention; final pin pending hardware GL** | Confound isolated (2026-07-11 follow-up, `results/…-lp2-observer.json`): with the rasterizer capped (`LP_NUM_THREADS=2`) the 1 kHz A/B shows **p99 identical** (65.9 µs no-op vs 65.7 µs attached) and p99.9 +12% (153 → 171 µs) — no tail coupling through the ingestion boundary; the original p99.9 blow-up (115 → 991 µs) was llvmpipe occupying the producer's cores, exactly as diagnosed. Residual p50 shift (1.8 → 8.5 µs, <1% of the loop period) is powersave-governor wake-up noise, not back-pressure. The headline invisibility number still gets pinned on hardware GL + performance governor when a display session is available (`./scripts/bench_ingestion.sh --filter=observer`). | | I6 bounded memory | **conforms (data path)** | Soak: RSS growth ≈ 0 KiB over the soak window at 100 kHz + rendering (see `soak/rss_growth` row). All data-path buffers bounded by construction. Caveat: `ThreadSafeQueue` (event path) is unbounded — kept out of the data plane by this contract, flagged for its own bound. | | I7 measured claims | **partial** | Suite exists in-tree, one-command, JSON + hardware context, alloc-gated. Gap: not yet a CI regression gate (no pinned-reference comparison job like telemetry S1 / messaging M9). | @@ -96,7 +96,7 @@ Reference hardware: i7-8700 (12 threads), `powersave` governor, Linux 5.15.0-185 2. **I7 — CI regression gate**: pin `results/2026-07-11_*.json` as the reference, add a compare step (the xmMessaging `bench/compare.py` shape) to CI so budget breaches fail the pipeline. 3. **I2 — slot pre-sizing** for `DataStream`/`DoubleBuffer` (e.g. `Reserve(args...)` constructing both slots at declared capacity) so heap-owning payloads get a library-backed alloc-free steady state instead of a usage convention. 4. **I3/I1 hardening (optional, measured-first)**: replace the Path B mutex with a seqlock latest-slot for trivially-copyable `T` (the xmMessaging `LatestSlot` shape) to remove producer waits proportional to `sizeof(T)` during render-side copies. Only if a real payload profile breaches budgets — the contract forbids speculative rework. -5. **I5 — re-run the observer A/B on a hardware-GL host** (and ideally performance governor / pinned cores): the reference environment renders with llvmpipe, which burns CPU cores and perturbs the producer loop's scheduler tails (p99.9 115 µs → 991 µs) independently of the ingestion boundary. The invisibility number stays unpinned until measured where rendering does not compete for the producer's cores. +5. **I5 — pin the headline number on hardware GL** (performance governor, display session): the boundary is proven tail-clean under capped-rasterizer xvfb (p99 identical; see conformance table), so this is now confirmation on representative hardware rather than an open question. ## How to run diff --git a/imgui.ini b/imgui.ini new file mode 100644 index 0000000..909248a --- /dev/null +++ b/imgui.ini @@ -0,0 +1,37 @@ +[Window][Debug##Default] +Pos=60,60 +Size=400,400 +Collapsed=0 + +[Window][bench_plot_render60/ring_write_scalar/1kHz] +Pos=60,60 +Size=32,32 +Collapsed=0 + +[Window][bench_plot_render60/ring_write_scalar/100kHz] +Pos=60,60 +Size=32,32 +Collapsed=0 + +[Window][bench_plot_stalled/ring_write_scalar/1kHz] +Pos=60,60 +Size=32,32 +Collapsed=0 + +[Window][bench_plot_stalled/ring_write_scalar/100kHz] +Pos=60,60 +Size=32,32 +Collapsed=0 + +[Window][bench_plot_observer_attached] +Pos=60,60 +Size=32,32 +Collapsed=0 + +[Window][bench_plot_soak] +Pos=60,60 +Size=32,32 +Collapsed=0 + +[Docking][Data] + diff --git a/ingestion_bench_report.json b/ingestion_bench_report.json new file mode 100644 index 0000000..8769ea0 --- /dev/null +++ b/ingestion_bench_report.json @@ -0,0 +1,23 @@ +{ + "schema": "quickviz-ingestion-bench-v1", "generated_at_utc": "2026-07-11T03:33:17Z", "smoke": true, + "hardware": { "cpu_model": "Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz", "nproc": 12, "governor": "powersave", "kernel": "5.15.0-185-generic", "preempt_rt": false, "display": ":99", "gl_renderer": "unknown", "load_avg_1m": 0.5, "load_avg_5m": 0.6, "load_avg_15m": 0.7 }, + "alloc_gate": { "passed": true, "failures": [] }, + "benchmarks": [ + { "name": "micro/ring_write_scalar/burst", "group": "micro", "mode": "headless", "unit": "ns", "rate_hz": 0.0, "batch": 64, "samples": 2000, "p50": 12.8, "p99": 14.5, "p999": 59.0, "max": 112.5, "mean": 12.9, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "max-rate burst; ring in steady-state overwrite" }, + { "name": "micro/ring_write_pose/burst", "group": "micro", "mode": "headless", "unit": "ns", "rate_hz": 0.0, "batch": 64, "samples": 2000, "p50": 10.4, "p99": 10.7, "p999": 10.9, "max": 12.9, "mean": 10.5, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "max-rate burst; ring in steady-state overwrite" }, + { "name": "micro/stream_push_pose/burst", "group": "micro", "mode": "headless", "unit": "ns", "rate_hz": 0.0, "batch": 64, "samples": 2000, "p50": 13.1, "p99": 15.0, "p999": 37.4, "max": 226.9, "mean": 13.6, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "latest-only overwrite, no consumer" }, + { "name": "paced/ring_write_scalar/1kHz", "group": "paced", "mode": "headless", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 1000, "p50": 1079.0, "p99": 1499.0, "p999": 2091.0, "max": 15281.0, "mean": 881.2, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "per-op timing incl. ~2 clock reads; no consumer" }, + { "name": "paced/ring_write_scalar/100kHz", "group": "paced", "mode": "headless", "unit": "ns", "rate_hz": 100000.0, "batch": 1, "samples": 25000, "p50": 31.0, "p99": 180.0, "p999": 256.0, "max": 452.0, "mean": 45.6, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "per-op timing incl. ~2 clock reads; no consumer" }, + { "name": "paced/stream_push_pose/1kHz", "group": "paced", "mode": "headless", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 1000, "p50": 1213.0, "p99": 1461.0, "p999": 2184.0, "max": 2252.0, "mean": 965.9, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "per-op timing incl. ~2 clock reads; no consumer" }, + { "name": "paced/stream_push_pose/100kHz", "group": "paced", "mode": "headless", "unit": "ns", "rate_hz": 100000.0, "batch": 1, "samples": 25000, "p50": 25.0, "p99": 140.0, "p999": 508.0, "max": 1085.0, "mean": 48.6, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "per-op timing incl. ~2 clock reads; no consumer" }, + { "name": "render60/ring_write_scalar/1kHz", "group": "render60", "mode": "windowed", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 2000, "p50": 562.0, "p99": 1441.0, "p999": 2135.0, "max": 16319.0, "mean": 675.2, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.8, "notes": "RtLinePlotWidget drains ring every frame" }, + { "name": "render60/ring_write_scalar/100kHz", "group": "render60", "mode": "windowed", "unit": "ns", "rate_hz": 100000.0, "batch": 1, "samples": 100000, "p50": 43.0, "p99": 116.0, "p999": 1278.0, "max": 2987.0, "mean": 59.2, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.9, "notes": "RtLinePlotWidget drains ring every frame" }, + { "name": "render60/stream_push_pose/1kHz", "group": "render60", "mode": "windowed", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 2000, "p50": 1025.0, "p99": 1620.0, "p999": 2536.0, "max": 15164.0, "mean": 887.1, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.8, "notes": "render plane pulls latest once per frame" }, + { "name": "stalled/ring_write_scalar/1kHz", "group": "stalled", "mode": "stalled", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 2000, "p50": 1063.0, "p99": 1372.0, "p999": 2163.0, "max": 2341.0, "mean": 842.0, "allocations": 0, "alloc_gated": true, "achieved_fps": 1.0, "notes": "RtLinePlotWidget drains ring every frame" }, + { "name": "stalled/ring_write_scalar/100kHz", "group": "stalled", "mode": "stalled", "unit": "ns", "rate_hz": 100000.0, "batch": 1, "samples": 100000, "p50": 40.0, "p99": 92.0, "p999": 160.0, "max": 20441.0, "mean": 44.2, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "RtLinePlotWidget drains ring every frame" }, + { "name": "stalled/stream_push_pose/1kHz", "group": "stalled", "mode": "stalled", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 2000, "p50": 1201.0, "p99": 1487.0, "p999": 1953.0, "max": 15058.0, "mean": 934.3, "allocations": 0, "alloc_gated": true, "achieved_fps": 1.0, "notes": "render plane pulls latest once per frame" }, + { "name": "observer/noop_headless", "group": "observer", "mode": "headless", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 1999, "p50": 11792.0, "p99": 82643.0, "p999": 98919.0, "max": 102027.0, "mean": 18320.1, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "loop period jitter |period - 1ms|; ingestion compiled out" }, + { "name": "observer/attached_render60", "group": "observer", "mode": "windowed", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 1999, "p50": 13443.0, "p99": 394974.0, "p999": 996318.0, "max": 1200344.0, "mean": 26912.9, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.8, "notes": "loop period jitter |period - 1ms|; scalar+pose ingestion at 1 kHz, plot + stream drain rendering" }, + { "name": "soak/rss_growth", "group": "soak", "mode": "windowed", "unit": "KiB", "rate_hz": 0.0, "batch": 1, "samples": 10, "p50": 0.0, "p99": 0.0, "p999": 0.0, "max": 0.0, "mean": 0.0, "allocations": 0, "alloc_gated": false, "achieved_fps": 60.0, "notes": "RSS growth vs post-warmup baseline; 6 s soak, scalar@100kHz + pose@1kHz; rss_warm=113064 KiB, rss_end=113064 KiB" } + ] +} diff --git a/obs_lp2.json b/obs_lp2.json new file mode 100644 index 0000000..c2a434c --- /dev/null +++ b/obs_lp2.json @@ -0,0 +1,9 @@ +{ + "schema": "quickviz-ingestion-bench-v1", "generated_at_utc": "2026-07-11T13:43:15Z", "smoke": false, + "hardware": { "cpu_model": "Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz", "nproc": 12, "governor": "powersave", "kernel": "5.15.0-185-generic", "preempt_rt": false, "display": ":99", "gl_renderer": "unknown", "load_avg_1m": 0.2, "load_avg_5m": 0.1, "load_avg_15m": 0.1 }, + "alloc_gate": { "passed": true, "failures": [] }, + "benchmarks": [ + { "name": "observer/noop_headless", "group": "observer", "mode": "headless", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 9999, "p50": 1825.0, "p99": 65874.0, "p999": 152861.0, "max": 652900.0, "mean": 7545.3, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "loop period jitter |period - 1ms|; ingestion compiled out" }, + { "name": "observer/attached_render60", "group": "observer", "mode": "windowed", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 9999, "p50": 8482.0, "p99": 65688.0, "p999": 171305.0, "max": 426223.0, "mean": 18585.2, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.9, "notes": "loop period jitter |period - 1ms|; scalar+pose ingestion at 1 kHz, plot + stream drain rendering" } + ] +} diff --git a/tests/benchmarks/ingestion/results/2026-07-11_i7-8700_xvfb-llvmpipe-lp2-observer.json b/tests/benchmarks/ingestion/results/2026-07-11_i7-8700_xvfb-llvmpipe-lp2-observer.json new file mode 100644 index 0000000..c2a434c --- /dev/null +++ b/tests/benchmarks/ingestion/results/2026-07-11_i7-8700_xvfb-llvmpipe-lp2-observer.json @@ -0,0 +1,9 @@ +{ + "schema": "quickviz-ingestion-bench-v1", "generated_at_utc": "2026-07-11T13:43:15Z", "smoke": false, + "hardware": { "cpu_model": "Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz", "nproc": 12, "governor": "powersave", "kernel": "5.15.0-185-generic", "preempt_rt": false, "display": ":99", "gl_renderer": "unknown", "load_avg_1m": 0.2, "load_avg_5m": 0.1, "load_avg_15m": 0.1 }, + "alloc_gate": { "passed": true, "failures": [] }, + "benchmarks": [ + { "name": "observer/noop_headless", "group": "observer", "mode": "headless", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 9999, "p50": 1825.0, "p99": 65874.0, "p999": 152861.0, "max": 652900.0, "mean": 7545.3, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "loop period jitter |period - 1ms|; ingestion compiled out" }, + { "name": "observer/attached_render60", "group": "observer", "mode": "windowed", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 9999, "p50": 8482.0, "p99": 65688.0, "p999": 171305.0, "max": 426223.0, "mean": 18585.2, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.9, "notes": "loop period jitter |period - 1ms|; scalar+pose ingestion at 1 kHz, plot + stream drain rendering" } + ] +} From 6d9d6dfa452eb4b983b5d989e114434cfaa66750 Mon Sep 17 00:00:00 2001 From: Ruixiang Du Date: Sat, 11 Jul 2026 21:44:50 +0800 Subject: [PATCH 2/2] chore: drop stray bench-run artifacts; ignore root run outputs imgui.ini and root-level report JSONs are per-run working files; the canonical pinned result lives in tests/benchmarks/ingestion/results/. --- .gitignore | 4 ++++ imgui.ini | 37 ------------------------------------- ingestion_bench_report.json | 23 ----------------------- obs_lp2.json | 9 --------- 4 files changed, 4 insertions(+), 69 deletions(-) delete mode 100644 imgui.ini delete mode 100644 ingestion_bench_report.json delete mode 100644 obs_lp2.json diff --git a/.gitignore b/.gitignore index 49d00ed..220ba11 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,7 @@ CMakeSettings.json *.exe *.out *.app + +# bench run artifacts (canonical copies live in tests/benchmarks/ingestion/results/) +imgui.ini +/*.json diff --git a/imgui.ini b/imgui.ini deleted file mode 100644 index 909248a..0000000 --- a/imgui.ini +++ /dev/null @@ -1,37 +0,0 @@ -[Window][Debug##Default] -Pos=60,60 -Size=400,400 -Collapsed=0 - -[Window][bench_plot_render60/ring_write_scalar/1kHz] -Pos=60,60 -Size=32,32 -Collapsed=0 - -[Window][bench_plot_render60/ring_write_scalar/100kHz] -Pos=60,60 -Size=32,32 -Collapsed=0 - -[Window][bench_plot_stalled/ring_write_scalar/1kHz] -Pos=60,60 -Size=32,32 -Collapsed=0 - -[Window][bench_plot_stalled/ring_write_scalar/100kHz] -Pos=60,60 -Size=32,32 -Collapsed=0 - -[Window][bench_plot_observer_attached] -Pos=60,60 -Size=32,32 -Collapsed=0 - -[Window][bench_plot_soak] -Pos=60,60 -Size=32,32 -Collapsed=0 - -[Docking][Data] - diff --git a/ingestion_bench_report.json b/ingestion_bench_report.json deleted file mode 100644 index 8769ea0..0000000 --- a/ingestion_bench_report.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "schema": "quickviz-ingestion-bench-v1", "generated_at_utc": "2026-07-11T03:33:17Z", "smoke": true, - "hardware": { "cpu_model": "Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz", "nproc": 12, "governor": "powersave", "kernel": "5.15.0-185-generic", "preempt_rt": false, "display": ":99", "gl_renderer": "unknown", "load_avg_1m": 0.5, "load_avg_5m": 0.6, "load_avg_15m": 0.7 }, - "alloc_gate": { "passed": true, "failures": [] }, - "benchmarks": [ - { "name": "micro/ring_write_scalar/burst", "group": "micro", "mode": "headless", "unit": "ns", "rate_hz": 0.0, "batch": 64, "samples": 2000, "p50": 12.8, "p99": 14.5, "p999": 59.0, "max": 112.5, "mean": 12.9, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "max-rate burst; ring in steady-state overwrite" }, - { "name": "micro/ring_write_pose/burst", "group": "micro", "mode": "headless", "unit": "ns", "rate_hz": 0.0, "batch": 64, "samples": 2000, "p50": 10.4, "p99": 10.7, "p999": 10.9, "max": 12.9, "mean": 10.5, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "max-rate burst; ring in steady-state overwrite" }, - { "name": "micro/stream_push_pose/burst", "group": "micro", "mode": "headless", "unit": "ns", "rate_hz": 0.0, "batch": 64, "samples": 2000, "p50": 13.1, "p99": 15.0, "p999": 37.4, "max": 226.9, "mean": 13.6, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "latest-only overwrite, no consumer" }, - { "name": "paced/ring_write_scalar/1kHz", "group": "paced", "mode": "headless", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 1000, "p50": 1079.0, "p99": 1499.0, "p999": 2091.0, "max": 15281.0, "mean": 881.2, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "per-op timing incl. ~2 clock reads; no consumer" }, - { "name": "paced/ring_write_scalar/100kHz", "group": "paced", "mode": "headless", "unit": "ns", "rate_hz": 100000.0, "batch": 1, "samples": 25000, "p50": 31.0, "p99": 180.0, "p999": 256.0, "max": 452.0, "mean": 45.6, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "per-op timing incl. ~2 clock reads; no consumer" }, - { "name": "paced/stream_push_pose/1kHz", "group": "paced", "mode": "headless", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 1000, "p50": 1213.0, "p99": 1461.0, "p999": 2184.0, "max": 2252.0, "mean": 965.9, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "per-op timing incl. ~2 clock reads; no consumer" }, - { "name": "paced/stream_push_pose/100kHz", "group": "paced", "mode": "headless", "unit": "ns", "rate_hz": 100000.0, "batch": 1, "samples": 25000, "p50": 25.0, "p99": 140.0, "p999": 508.0, "max": 1085.0, "mean": 48.6, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "per-op timing incl. ~2 clock reads; no consumer" }, - { "name": "render60/ring_write_scalar/1kHz", "group": "render60", "mode": "windowed", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 2000, "p50": 562.0, "p99": 1441.0, "p999": 2135.0, "max": 16319.0, "mean": 675.2, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.8, "notes": "RtLinePlotWidget drains ring every frame" }, - { "name": "render60/ring_write_scalar/100kHz", "group": "render60", "mode": "windowed", "unit": "ns", "rate_hz": 100000.0, "batch": 1, "samples": 100000, "p50": 43.0, "p99": 116.0, "p999": 1278.0, "max": 2987.0, "mean": 59.2, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.9, "notes": "RtLinePlotWidget drains ring every frame" }, - { "name": "render60/stream_push_pose/1kHz", "group": "render60", "mode": "windowed", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 2000, "p50": 1025.0, "p99": 1620.0, "p999": 2536.0, "max": 15164.0, "mean": 887.1, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.8, "notes": "render plane pulls latest once per frame" }, - { "name": "stalled/ring_write_scalar/1kHz", "group": "stalled", "mode": "stalled", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 2000, "p50": 1063.0, "p99": 1372.0, "p999": 2163.0, "max": 2341.0, "mean": 842.0, "allocations": 0, "alloc_gated": true, "achieved_fps": 1.0, "notes": "RtLinePlotWidget drains ring every frame" }, - { "name": "stalled/ring_write_scalar/100kHz", "group": "stalled", "mode": "stalled", "unit": "ns", "rate_hz": 100000.0, "batch": 1, "samples": 100000, "p50": 40.0, "p99": 92.0, "p999": 160.0, "max": 20441.0, "mean": 44.2, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "RtLinePlotWidget drains ring every frame" }, - { "name": "stalled/stream_push_pose/1kHz", "group": "stalled", "mode": "stalled", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 2000, "p50": 1201.0, "p99": 1487.0, "p999": 1953.0, "max": 15058.0, "mean": 934.3, "allocations": 0, "alloc_gated": true, "achieved_fps": 1.0, "notes": "render plane pulls latest once per frame" }, - { "name": "observer/noop_headless", "group": "observer", "mode": "headless", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 1999, "p50": 11792.0, "p99": 82643.0, "p999": 98919.0, "max": 102027.0, "mean": 18320.1, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "loop period jitter |period - 1ms|; ingestion compiled out" }, - { "name": "observer/attached_render60", "group": "observer", "mode": "windowed", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 1999, "p50": 13443.0, "p99": 394974.0, "p999": 996318.0, "max": 1200344.0, "mean": 26912.9, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.8, "notes": "loop period jitter |period - 1ms|; scalar+pose ingestion at 1 kHz, plot + stream drain rendering" }, - { "name": "soak/rss_growth", "group": "soak", "mode": "windowed", "unit": "KiB", "rate_hz": 0.0, "batch": 1, "samples": 10, "p50": 0.0, "p99": 0.0, "p999": 0.0, "max": 0.0, "mean": 0.0, "allocations": 0, "alloc_gated": false, "achieved_fps": 60.0, "notes": "RSS growth vs post-warmup baseline; 6 s soak, scalar@100kHz + pose@1kHz; rss_warm=113064 KiB, rss_end=113064 KiB" } - ] -} diff --git a/obs_lp2.json b/obs_lp2.json deleted file mode 100644 index c2a434c..0000000 --- a/obs_lp2.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "schema": "quickviz-ingestion-bench-v1", "generated_at_utc": "2026-07-11T13:43:15Z", "smoke": false, - "hardware": { "cpu_model": "Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz", "nproc": 12, "governor": "powersave", "kernel": "5.15.0-185-generic", "preempt_rt": false, "display": ":99", "gl_renderer": "unknown", "load_avg_1m": 0.2, "load_avg_5m": 0.1, "load_avg_15m": 0.1 }, - "alloc_gate": { "passed": true, "failures": [] }, - "benchmarks": [ - { "name": "observer/noop_headless", "group": "observer", "mode": "headless", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 9999, "p50": 1825.0, "p99": 65874.0, "p999": 152861.0, "max": 652900.0, "mean": 7545.3, "allocations": 0, "alloc_gated": true, "achieved_fps": -1.0, "notes": "loop period jitter |period - 1ms|; ingestion compiled out" }, - { "name": "observer/attached_render60", "group": "observer", "mode": "windowed", "unit": "ns", "rate_hz": 1000.0, "batch": 1, "samples": 9999, "p50": 8482.0, "p99": 65688.0, "p999": 171305.0, "max": 426223.0, "mean": 18585.2, "allocations": 0, "alloc_gated": true, "achieved_fps": 59.9, "notes": "loop period jitter |period - 1ms|; scalar+pose ingestion at 1 kHz, plot + stream drain rendering" } - ] -}