DART 7 World Performance Dashboard
==================================
DART publishes a public performance dashboard that tracks DART 7 World
Google Benchmark results over time:
* Dashboard:
`https://dartsim.github.io/dart/performance/ `_
The live dashboard is embedded below. If it does not load (for example before
the first publication), open it directly with the link above.
.. raw:: html
It is scoped to the DART 7 World and its solver families, tracking
their end-to-end ``World::step`` (and kinematics-update) throughput:
* **Core step & scaling** — kinematics updates, world-step throughput with
sequential vs parallel compute executors, rigid-body step scaling, the
contact-shaped and contact-island scalable-compute proxies, and the Phase 5
CPU baseline row.
* **Rigid-body dynamics solver** — a stacked-box World step with the default
sequential-impulse contact solve and the opt-in IPC barrier solve.
* **Deformable solver (Vertex Block Descent)** — a deformable-grid World step
with the default gradient-descent solver and the VBD solver.
* **Deformable solver (FEM)** — a neo-Hookean FEM beam World step through the
sparse projected-Newton solve.
* **Augmented VBD rigid** — a fixed-joint rigid-chain World step routed through
the AVBD contact projection.
It deliberately excludes internal micro-kernels (distance, barrier,
tangent-stencil, candidate-set, …), CUDA/GPU-only rows, and
``DART_BUILD_DIFF``-gated rows — they either need hardware or a build flag the
GitHub-hosted runner does not provide — along with unrelated SIMD and
robot-loader surfaces, so the headline charts stay focused on experimental
World step throughput.
The dashboard is built entirely on GitHub infrastructure. A GitHub Actions
workflow runs DART's benchmark suites and hands the Google Benchmark JSON to
`benchmark-action/github-action-benchmark
`_, which stores
the history on the ``gh-pages`` branch and renders an interactive Chart.js page.
There is no external account, API token, or third-party service to maintain.
The dashboard URL returns ``404`` until a ``main`` push, scheduled, or manually
dispatched run of the **Performance Dashboard** workflow has published to
``gh-pages`` and GitHub Pages has finished building the branch.
Readable labels
---------------
Raw Google Benchmark names like ``BM_VbdWorldStepVbd/16`` are rewritten into
readable chart titles such as ``Deformable world step (VBD) · 16×16 grid`` by
``scripts/benchmark_display_names.py``. The merge step applies this with
``--humanize`` so the published chart titles (and the per-PR comparison table)
read in plain language; the local preview groups the charts into the solver
families above and labels the axes (commit on x, time-per-op on y, lower is
better). Because ``github-action-benchmark`` keys history by the series name,
the first publish after this change starts fresh history lines under the new
readable names. The run-time ``--benchmark_filter`` and the
``check_compute_graph_benchmarks.py`` gate keep using the raw names, so the
rename is purely cosmetic.
How it works
------------
The ``Performance Dashboard`` workflow
(``.github/workflows/performance_dashboard.yml``) runs on every push to ``main``
that touches benchmark-relevant paths, twice weekly on a schedule, and on
manual dispatch. Each run:
#. builds and runs the bounded benchmark surfaces with
``scripts/run_performance_dashboard_benchmarks.py``;
#. merges the per-target JSON into one file with
``scripts/merge_benchmark_results.py``;
#. publishes the result with ``github-action-benchmark``, which appends a point
to the per-benchmark history and updates the hosted page.
When a benchmark regresses past the alert threshold the action posts a comment
on the offending commit. GitHub-hosted runners are noisy, so the threshold is
set conservatively (``200%``) and a regression does not fail the build.
Preview a run locally
---------------------
You can render the same dashboard locally before anything is published::
pixi run bm-dashboard-surfaces # build and run the benchmark surfaces
pixi run bm-dashboard-preview # render build/performance-dashboard/index.html
Open ``build/performance-dashboard/index.html`` in a browser. The preview reads
the same ``window.BENCHMARK_DATA`` shape that the hosted dashboard uses, so it
matches what will be published. Pass ``--append`` to
``scripts/preview_performance_dashboard.py`` to accumulate multiple runs into a
local history.
Add a benchmark to the dashboard
--------------------------------
The dashboard reuses DART's existing Google Benchmark targets. To track a new
surface, add a ``BenchmarkSpec`` entry to
``scripts/run_performance_dashboard_benchmarks.py`` pointing at the target and a
bounded ``--benchmark_filter`` (prefer the CPU-only, end-to-end ``World::step``
rows). For readable chart titles, add a matching entry to ``SURFACES`` in
``scripts/benchmark_display_names.py``; unmapped names still render via a generic
fallback. No dashboard code changes are required; the action picks up whatever
rows appear in the merged JSON.
Setup (maintainers)
-------------------
The dashboard requires GitHub Pages to serve from the ``gh-pages`` branch
(Settings -> Pages -> Source: ``gh-pages`` / root). The workflow's
``contents: write`` permission lets the action create and update that branch.
Future work
-----------
The core pipeline is intentionally minimal. Natural extensions, added once the
baseline is stable, include per-PR regression comments and an optional secondary
backend such as `Bencher `_ or
`CodSpeed `_ for noise-controlled regression gating.