Benchmarks
This page publishes the macro CLI benchmark results produced by make bench-macro. It is intended as a technical reference for engineers evaluating runtime characteristics, not as a cross-machine league table.
Two datasets are shown:
- A checked-in Apple M5 Max snapshot generated from local benchmark exports.
- A Linux CI snapshot regenerated during the GitHub Pages deploy for the latest published release.
Compare tools within the same snapshot. Absolute numbers across different machines are useful for rough orientation only.
Snapshot Overview
| Snapshot | Environment | Commit | shuck (all) | Comparison (all) | Speedup |
|---|---|---|---|---|---|
| Apple M5 Max checked-in snapshot Checked-in local snapshot | Apple M5 Max macOS snapshot macOS 26.4 (arm64) | 919615b Apr 20, 2026, 5:18 PM | 56.2 ms (+/- 928.7 us) | 7.95 s (+/- 559.8 ms) | 141.4x |
| GitHub Actions latest release snapshot CI snapshot | GitHub Actions ubuntu-latest GitHub Actions (x86_64) | n/a Apr 20, 2026, 12:00 AM | not generated in this build | not generated in this build | n/a |
Methodology
- The runner is
hyperfinewith3warmups and10measured runs per case. shuckis measured withcheck --no-cacheso the results reflect parsing and linting work rather than cache reuse.- The comparison command is
shellcheck --severity=style <fixture>on the same input. --ignore-failureis intentional. These fixtures contain lint findings, so non-zero exit codes are expected and the benchmark is measuring runtime rather than success state.- Each fixture is benchmarked independently, and the
allcase benchmarks one invocation over the entire vendored corpus.
Reproducing Results
Refresh the checked-in local snapshot
make bench-macro-site-localGenerate a CI-style dataset manually
./scripts/benchmarks/setup.sh hyperfine shellcheck
./scripts/benchmarks/run.sh
python3 ./scripts/benchmarks/export_website_data.py \
--repo-root . \
--bench-dir .cache \
--output website/generated/benchmarks/ci-latest.json \
--dataset-id ci-latest \
--dataset-name "GitHub Actions latest release snapshot" \
--dataset-description "Generated during the website deploy workflow for the latest published release." \
--environment-kind ci \
--environment-label "GitHub Actions ubuntu-latest"Apple M5 Max checked-in snapshot
Checked-in make bench-macro results captured on an Apple M5 Max macOS development machine.
| Environment | Apple M5 Max macOS snapshot |
|---|---|
| OS / arch | macOS 26.4 (arm64) |
| CPU | Apple M5 Max |
| Generated | Apr 20, 2026, 5:18 PM |
| Commit | 919615b |
| Runner | hyperfine 3 warmups / 10 measured runs |
| shuck | shuck 0.0.8 |
| shellcheck | 0.11.0 |
| Aggregate result | 56.2 ms (+/- 928.7 us) |
| Aggregate speedup | 141.4x faster than shellcheck |
Apple M5 results
| Case | Size | shuck | Comparison | Speedup | shuck RSS | Comparison RSS |
|---|---|---|---|---|---|---|
| all 5 files in one invocation | 318.0 KiB 10,671 lines | 56.2 ms (+/- 928.7 us) | 7.95 s (+/- 559.8 ms) | 141.4x | 96.7 MiB | 2.56 GiB |
| homebrew-install.sh Homebrew/install | 32.4 KiB 1,175 lines | 9.0 ms (+/- 151.3 us) | 312.5 ms (+/- 5.1 ms) | 34.76x | 16.3 MiB | 169.1 MiB |
| nvm.sh nvm-sh/nvm | 146.7 KiB 4,661 lines | 45.7 ms (+/- 567.8 us) | 6.94 s (+/- 115.2 ms) | 151.6x | 59.2 MiB | 2.63 GiB |
| pyenv-python-build.sh pyenv/pyenv | 79.8 KiB 2,740 lines | 25.3 ms (+/- 301.2 us) | 33.3 ms (+/- 155.7 us) | 1.32x | 33.3 MiB | 33.4 MiB |
| ruby-build.sh rbenv/ruby-build | 46.6 KiB 1,643 lines | 15.5 ms (+/- 278.1 us) | 384.9 ms (+/- 12.8 ms) | 24.78x | 23.7 MiB | 123.2 MiB |
| fzf-install.sh junegunn/fzf | 12.5 KiB 452 lines | 6.5 ms (+/- 129.6 us) | 121.3 ms (+/- 380.8 us) | 18.80x | 12.0 MiB | 57.9 MiB |
GitHub Actions latest release snapshot
A fresh Linux snapshot is generated during the GitHub Pages deploy for the latest published release. Local builds and pull request builds use this placeholder instead.
| Environment | GitHub Actions ubuntu-latest |
|---|---|
| OS / arch | GitHub Actions (x86_64) |
| CPU | Unknown |
| Generated | Apr 20, 2026, 12:00 AM |
| Commit | n/a |
| Runner | hyperfine 3 warmups / 10 measured runs |
| shuck | Unknown |
| Comparison tool | Not included |
| Aggregate result | This build does not include a generated aggregate result. |
| Aggregate speedup | n/a |
The checked-in placeholder was used for this build. The GitHub Pages deployment for the latest published release regenerates the CI snapshot before exporting the site.
Benchmark Corpus
The benchmark corpus is vendored into the repository so every run uses the same inputs. The current corpus contains 5 files, 10,671 lines, and 318.0 KiB of shell source.
| Fixture | Source | Size | License |
|---|---|---|---|
| homebrew-install.sh 6d5e267 | Homebrew/install install.sh | 32.4 KiB 1,175 lines | BSD-2-Clause |
| nvm.sh 977563e | nvm-sh/nvm nvm.sh | 146.7 KiB 4,661 lines | MIT |
| pyenv-python-build.sh 8397a19 | pyenv/pyenv plugins/python-build/bin/python-build | 79.8 KiB 2,740 lines | MIT |
| ruby-build.sh d099da0 | rbenv/ruby-build bin/ruby-build | 46.6 KiB 1,643 lines | MIT |
| fzf-install.sh 55d5b15 | junegunn/fzf install | 12.5 KiB 452 lines | MIT |