@@ -159,8 +159,21 @@ pixi install
159159pixi run help
160160pixi run check
161161pixi run release-check
162+ pixi run qtools-install
163+ pixi run qspy -c /dev/ttyACM0 -b 115200
164+ pixi run bench-smoke
165+ pixi run bench-full --json-out bench_results.jsonl
162166```
163167
168+ Pixi forwards extra arguments after the task name to the underlying command, so
169+ ` pixi run bench-full --json-out bench_results.jsonl --label "lab-a" ` works
170+ as expected and appends one JSON result object for that run.
171+
172+ For the stock transport-agnostic tasks (` all-on ` , ` all-off ` , ` bench ` ,
173+ ` bench-smoke ` , and ` bench-full ` ), set ` ARENA_ETH_IP ` or
174+ ` ARENA_SERIAL_PORT ` in your shell before running the task. This is the
175+ simplest way to choose the transport without rewriting the task command.
176+
164177### Plain pip
165178
166179``` sh
@@ -170,6 +183,81 @@ python -m build
170183python -m twine check dist/*
171184```
172185
186+ ## Performance characterization workflow
187+
188+ ` bench_results.jsonl ` stores the host-side benchmark results, while QSPY
189+ captures the raw firmware QS stream so you can compare those host-side
190+ measurements with device-side ` PERF_* ` records such as ` PERF_UPD kind=SPF ` and
191+ ` PERF_NET ` .
192+
193+ A convenient workflow is to keep both artifacts under a single timestamped
194+ directory.
195+
196+ ### Terminal A: start QSPY and capture the raw QS log
197+
198+ ``` sh
199+ mkdir -p bench_artifacts/2026-03-13-eth
200+ pixi run qtools-install
201+ pixi run qspy -c /dev/ttyACM0 -b 115200 2>&1 | tee bench_artifacts/2026-03-13-eth/qspy.log
202+ ```
203+
204+ PowerShell:
205+
206+ ``` powershell
207+ New-Item -ItemType Directory -Force bench_artifacts\2026-03-13-eth | Out-Null
208+ pixi run qtools-install
209+ pixi run qspy -c COM3 -b 115200 2>&1 | Tee-Object -FilePath bench_artifacts\2026-03-13-eth\qspy.log
210+ ```
211+
212+ Leave QSPY running while the benchmark executes in a second terminal. Stop it
213+ after the benchmark completes so the log contains the full run.
214+
215+ ### Terminal B: run the host benchmark and append JSONL results
216+
217+ ``` sh
218+ export ARENA_ETH_IP=192.168.10.104
219+ pixi run bench-full \
220+ --json-out bench_artifacts/2026-03-13-eth/bench_results.jsonl \
221+ --label " fw=7.0.0 host=$( hostname) transport=ethernet"
222+ ```
223+
224+ PowerShell:
225+
226+ ``` powershell
227+ $env:ARENA_ETH_IP = "192.168.10.104"
228+ pixi run bench-full --json-out bench_artifacts\2026-03-13-eth\bench_results.jsonl --label "fw=7.0.0 host=$env:COMPUTERNAME transport=ethernet"
229+ ```
230+
231+ ` bench-full ` runs the suite plus a streaming phase using
232+ ` patterns/pat0004.pat ` . Use ` pixi run bench-smoke ` first when you want a short
233+ sanity check before a longer capture. For Ethernet socket-option comparisons,
234+ ` pixi run bench-socket-matrix --ethernet 192.168.10.104 --json-out bench_matrix.jsonl `
235+ runs the suite across the predefined TCP tuning variants.
236+
237+ ### Preserve the artifact bundle
238+
239+ After the run, keep at least:
240+
241+ - ` bench_results.jsonl ` for host-side timings and metadata
242+ - ` qspy.log ` for the raw QS stream
243+ - a filtered ` qspy_perf.log ` for quick comparison (optional)
244+
245+ On POSIX you can extract just the performance lines with:
246+
247+ ``` sh
248+ grep ' PERF_' bench_artifacts/2026-03-13-eth/qspy.log > bench_artifacts/2026-03-13-eth/qspy_perf.log
249+ ```
250+
251+ PowerShell:
252+
253+ ``` powershell
254+ Select-String -Path bench_artifacts\2026-03-13-eth\qspy.log -Pattern 'PERF_' | ForEach-Object { $_.Line } | Set-Content bench_artifacts\2026-03-13-eth\qspy_perf.log
255+ ```
256+
257+ For reproducible comparisons, keep the artifact directory together with the
258+ firmware commit or tag, host computer, transport, switch/LAN notes, and the
259+ benchmark label you used.
260+
173261## Releasing
174262
175263The repository includes GitHub Actions workflows for CI and PyPI Trusted
@@ -179,7 +267,8 @@ Recommended release flow:
179267
1802681 . Update ` CHANGELOG.md ` .
1812692 . Run ` pixi run release-check ` or the equivalent pip commands above.
182- 3 . Commit the release changes and create a ` vX.Y.Z ` tag.
270+ 3 . Commit the release changes and create a release tag such as ` 7.0.0 ` or
271+ ` v7.0.0 ` .
1832724 . Push the tag to GitHub.
1842735 . The ` publish.yml ` workflow builds the wheel and sdist, then publishes them
185274 to PyPI using Trusted Publishing.
0 commit comments