Files
MercuryToolbox/docs/benchmarks/README.md
T

91 lines
3.7 KiB
Markdown

# Benchmark Harness Usage
This directory stores reproducible benchmark notes and reports for Mercury tools.
The mhash harness lives at `scripts/benchmark-mhash.ps1` and writes generated
artifacts under `target\mhash-benchmark\results` by default.
## Default Digest Benchmark
```powershell
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\benchmark-mhash.ps1
```
The default matrix keeps runtime reasonable: 1MiB, 64MiB, and 256MiB inputs;
MD5, SHA-1, SHA-256, and SHA-512; 1 warmup and 3 measured runs. It compares
Mercury `mhash` auto/read modes against available non-admin external tools.
## Fast Smoke Check
```powershell
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\benchmark-mhash-smoke.ps1 -SkipBuild
```
The smoke check runs a 1KiB SHA-256 Mercury-only matrix, validates required
telemetry fields, checks JSONL export counts, and verifies `-SizeOnly` emits
artifact telemetry without process records.
## Useful Modes
```powershell
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\benchmark-mhash.ps1 -SizeOnly -SkipBuild
```
Use `-SizeOnly` when you only need binary artifact telemetry. It skips fixture
creation and process benchmarks, but still writes raw JSON, artifact JSON/CSV,
empty summary files, and a Markdown report.
To inspect a prebuilt size-focused binary, point the harness at it:
```powershell
cargo build --profile release-size -p mercury-mhash --bin mhash
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\benchmark-mhash.ps1 -SizeOnly -SkipBuild -DigestPath .\target\release-size\mhash.exe
```
```powershell
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\benchmark-mhash.ps1 -Extended -Hyperfine
```
Use `-Extended` for a deeper matrix. Unless explicitly overridden, it raises
the run count to 5, warmups to 2, adds a 1GiB fixture, and benchmarks Mercury
`sum`, `jsonl`, and `json` output formats. Use `-Hyperfine` to add optional
`hyperfine` timing exports when `hyperfine` is available on `PATH`.
```powershell
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\benchmark-mhash.ps1 -Sizes 1KiB -Algorithms sha256 -DigestFormats sum,jsonl -Repeat 1 -Warmup 0 -NoExternal -SkipBuild
```
Use explicit small matrices for local harness checks or quick regression
triage.
## Emitted Telemetry
Each run now records wall time, CPU time, CPU as percent of one core and of the
machine, peak working set, mhash output format, binary path, binary size, and a
short stdout/stderr sample. Summaries include mean wall time, min wall time,
mean CPU milliseconds, throughput, peak working set, CPU percent of one core,
and binary size.
The raw report includes reproducibility metadata: invocation, script path,
workspace root, OS and process architecture, PowerShell version, logical
processor count, git branch/commit/status entries, fixture SHA-256 hashes,
tool paths/versions, artifact sizes, artifact SHA-256 hashes, and optional
hyperfine suites.
Generated files include:
- `*.raw.json`: full environment, records, summary, artifact, and hyperfine data.
- `*.records.jsonl`: one process measurement per line.
- `*.summary.json` and `*.summary.jsonl`: grouped summary rows.
- `*.summary.csv`: spreadsheet-friendly grouped summary rows.
- `*.artifacts.json` and `*.artifacts.csv`: binary size and identity metadata.
- `*.hyperfine.json` and `*.hyperfine.csv`: aggregate optional hyperfine output.
- `*.md`: human-readable report.
## Measurement Caveats
Windows does not expose a safe non-admin cache-drop primitive, so results are
warm-cache CLI timings. Very small fixtures mostly measure process startup and
output overhead. Peak working set comes from process telemetry and can miss very
short-lived allocation spikes. Hyperfine is opt-in and complements the built-in
wall/CPU/memory telemetry; it does not replace the harness process metrics.