Compare Across Machines¶
How to compare benchmark results from different runners or machines.
Multi-Runner Setup¶
When benchmarks run on different machines (e.g., GPU runner + CPU runner, or
x86 + ARM), each runner produces its own result files. Compare them with
compare-many mode.
Workflow Pattern¶
Use a matrix strategy to run benchmarks on different runners, then collect and compare results:
jobs:
benchmark:
strategy:
matrix:
runner: [ubuntu-latest, self-hosted-gpu]
runs-on: ${{ matrix.runner }}
steps:
- name: Run benchmarks
run: asv run --record-samples
- name: Upload results
uses: actions/upload-artifact@v4
with:
name: bench-${{ matrix.runner }}
path: .asv/results/
comment:
needs: benchmark
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: results/
merge-multiple: true
- name: Compare and post
uses: HaoZeke/asv-perch@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
results-path: results/
comparison-mode: compare-many
baseline-sha: ${{ env.BASELINE_SHA }}
contender-shas: ${{ env.CONTENDER_SHA }}
baseline-label: ubuntu-latest
contender-labels: self-hosted-gpu
Same Code, Different Environments¶
This pattern is also useful for comparing the same code across different environments without changing the code:
conda vs virtualenv
GCC vs Clang
Python 3.11 vs 3.12
CPU vs GPU (with appropriate ASV parametrization)
The action is purely a presentation layer – it does not care how the environments are set up or what they contain. It reads result files and renders tables.
Pre-computed Approach¶
For maximum control, run the comparison yourself and hand the output to the action:
- name: Compare
run: |
uvx asv-spyglass compare-many \
results/ubuntu-latest/*.json \
results/gpu-runner/*.json \
--label "CPU (ubuntu-latest)" \
--label "GPU (self-hosted)" \
> comparison.txt
- name: Post
uses: HaoZeke/asv-perch@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
comparison-text-file: comparison.txt
comparison-mode: compare-many