Skip to content

ci(benchmark): compare base and head on the same runner - #36

Merged
Kikobeats merged 2 commits into
masterfrom
Kikobeats/benchmark-same-runner
Oct 28, 2026
Merged

Kikobeats merged 2 commits into
masterfrom
Kikobeats/benchmark-same-runner

Conversation

@Kikobeats

@Kikobeats Kikobeats commented Oct 28, 2026 •

Copy link
Copy Markdown
Member

Why

The benchmark comment compared each PR against a stored baseline from the last master push. That baseline ran on whatever runner image and lts/* Node version that push got. On send-http#30 the PR ran on runner image 20261012 with Node 24.21.0, and the baseline on image 20261025 with Node 24.22.1. Untouched cases showed as 1.75x to 2.4x slower. An earlier run of unchanged code on the same image as the PR gave the same false slowdowns.

What changed

  • Each PR now checks out base (pull_request.base.sha) and head side by side in one job. It installs both, then runs both harnesses alternately for 5 rounds, switching which side goes first each round.
  • Each case reports the median of its 5 per-round medians. The base result goes into the action's data file under the base SHA, so github-action-benchmark compares head against base from the same runner and posts its usual comment. The same table also goes to the job summary, so fork PRs (read-only token, no comment) still get a result.
  • If base has no benchmark, its install fails, or every base round fails or writes no output, there is nothing to compare. github-action-benchmark skips its comment when there is no previous entry (writeBenchmark in v1.22.2), so in that case the head numbers appear only in the job summary. Each base failure emits a ::warning::. A head install or head run that fails still fails the job.
  • The job summary prints each case with its own unit (splashy reports peak RSS delta in MB).
  • The push trigger and the actions/cache baseline are gone, since nothing reads them now. Permissions drop to contents: read and pull-requests: write, and both checkouts use persist-credentials: false.

How it was tested

  • actionlint 1.7.12 with shellcheck passes on both variants, npm and pnpm.

  • I ran the workflow's two run: scripts locally, copied verbatim from the YAML, on debug-logfmt with base 277cddf and head cb8f859 (build(deps): bump actions/setup-node from 5 to 6 #25). The case build(deps): bump actions/setup-node from 5 to 6 #25 targets got faster, and the two untouched cases came out flat:

    case base head head/base
    call disabled 49.8 17.6 0.35
    call enabled to sink 73.2 73 1.00
    encode 5-key object 205.7 205.4 1.00
    duration disabled 113.1 84.1 0.74
  • I fed the seeded data file and head output to the action's own addBenchmarkEntry (v1.22.2 dist). It finds the base entry and gives the same ratios. That rules out the trap where the action skips entries that share the head's commit id.

  • I simulated a base with no benchmark/ (whoops before #59). The job passes, the summary shows head only, the data file is empty, and the action posts no comment.

  • I also simulated a base whose pnpm install 404s and a base harness that exits 0 without writing output. Both warn, finish with exit 0, and report head only.

  • End to end on whoops#61, which changes only the workflow: the bot comment shows ratios of 0.99 to 1.00 on every case. Before, untouched code showed up to 2.4x.

🤖 Generated with Claude Code

The stored baseline came from whatever runner and lts/* node the last
master push got, so PR comments flagged untouched cases as 1.7-2.4x
slower. Base and head now run alternately in the same job (5 rounds
each, median), and the action compares head against that base.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 79fdf4e9-2fb9-422e-9c15-dbb8de5dcde9
Commits

Reviewing files that changed from the base of the PR and between c36bead and 3f33d40.

Files selected for processing: 1
  • .github/workflows/benchmark.yml

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

Walkthrough

The benchmark workflow now compares results from the pull request base and head across five alternating rounds. It generates aggregated results and a comparison table, and limits benchmark comments to pull requests from the same repository.

Changes: Benchmark comparison

Layer / File(s) Summary
Workflow scope and checkouts
.github/workflows/benchmark.yml
The workflow runs only for pull requests. It uses read-only contents permission and checks out the pull request head and base separately.
Base and head benchmark rounds
.github/workflows/benchmark.yml
The workflow runs five alternating base and head rounds. Missing or failed base runs emit a warning and continue; a failed head run fails the workflow.
Comparison output and benchmark comment
.github/workflows/benchmark.yml
The workflow computes per-benchmark medians, ranges, and round values, then writes merged head results and a comparison table. The benchmark comment action runs only for same-repository pull requests.

Priority: Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Other

Sequence Diagram(s)

sequenceDiagram
  participant GitHubActions
  participant BaseHeadCheckouts
  participant BenchmarkRuns
  participant ComparisonStep
  participant BenchmarkCommentAction
  GitHubActions->>BaseHeadCheckouts: Check out pull request base and head
  BaseHeadCheckouts->>BenchmarkRuns: Provide base and head worktrees
  BenchmarkRuns->>ComparisonStep: Provide results from alternating rounds
  ComparisonStep->>BenchmarkCommentAction: Provide merged head results and benchmark data
Loading

Possibly related PRs

  • microlinkhq/tinyspawn#34: Adds the benchmark workflow that this change rewrites, including the earlier cache-based baseline flow.
Merge Risk: Minimal · up to 3f33d

The workflow is ready to merge after normal checks. No actionable benchmark comparison or comment-permission risk remains established.

Pre-merge checks: Passed 4
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly and concisely describes the main change: comparing benchmark results from the base and head revisions on the same runner.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tinyspawn

Details
Benchmark suite Current: 650a7b2 Previous: c36bead Ratio
spawn node -e 0 283.3 ms (281.4-298.9) 281.9 ms (272.6-290.2) 1.00
spawn 50MB stdout 73.1 ms (71.3-74.3) 71.4 ms (70.2-73) 1.02
read 50MB stdout x30 0 ms (0-0) 0 ms (0-0) 1

This comment was automatically generated by workflow using github-action-benchmark.

A failed base install, or a base run that exits without writing its
output, now warns and compares head alone instead of failing the job.
The summary shows each case's own unit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Kikobeats
Kikobeats merged commit 8589cbe into master Oct 28, 2026
8 checks passed
@Kikobeats
Kikobeats deleted the Kikobeats/benchmark-same-runner branch October 28, 2026 10:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant