Skip to content

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

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
Owner

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 (ci: allow pnpm builds through env instead of a per-install flag #25). The case ci: allow pnpm builds through env instead of a per-install flag #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

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 2 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

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: 756e0376-33d2-4c39-b26a-2f6fc8117fb2
Commits

Reviewing files that changed from the base of the PR and between f6c89c9 and ec49b69.

Files selected for processing: 1
  • .github/workflows/benchmark.yml
  • 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.

html-scripts

Details
Benchmark suite Current: ec49b69 Previous: f6c89c9 Ratio
getScripts 1MB page 55.4 ms (55-56.7) 55.6 ms (55.2-56.6) 1.00
getScripts 20KB page 70.5 ms (69.8-72.4) 70.8 ms (70.6-71.6) 1.00

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 fc86359 into master Oct 28, 2026
5 checks passed
@Kikobeats
Kikobeats deleted the Kikobeats/benchmark-same-runner branch October 28, 2026 10:15
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