Skip to content

Add performance tests#1868

Merged
justin808 merged 84 commits intomasterfrom
alexeyr/performance-tests
Jan 18, 2026
Merged

Add performance tests#1868
justin808 merged 84 commits intomasterfrom
alexeyr/performance-tests

Conversation

@alexeyr-ci2
Copy link
Copy Markdown
Collaborator

@alexeyr-ci2 alexeyr-ci2 commented Oct 20, 2025

Summary

Add performance tests. Fixes #1777.

Pull Request checklist

  • [ ] Add/update test to cover these changes
  • Update documentation
  • Update CHANGELOG file

This change is Reviewable

Summary by CodeRabbit

  • New Features

    • End-to-end performance benchmarking: local scripts, k6/vegeta workloads, HTML report splitting, and CI-driven benchmark reporting with regression detection.
  • Documentation

    • Added benchmarking strategy and CONTRIBUTING guidance; changelogs updated with benchmarking notes.
  • Chores

    • CI benchmark workflow, tooling and test-run helpers, ignore rules for bench results, production/start/build helper scripts, and benchmark utility libraries.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Oct 20, 2025

Walkthrough

Adds a CI benchmarking workflow and local benchmark tooling: k6/Vegeta scripts, Ruby benchmark helpers and BMF exporters, HTML report splitter, production start/build scripts for dummy apps, Puma/shakapacker tweaks, docs, .gitignore/knip/package updates, and supporting CI scripts.

Changes

Cohort / File(s) Summary
GitHub Actions & CI Workflow
\.github/workflows/benchmark.yml
New "Benchmark Workflow" with inputs/triggers, env/version constants, conditional runs, tool installs (k6/Vegeta/Bencher), CPU/priority tuning, build/start steps for Core & Pro dummy apps, Core (k6) and Pro (Vegeta) benchmark execution, BMF/Bencher upload, HTML report splitting, and PR/job summary posting.
Core Route Benchmarking
benchmarks/bench.rb, benchmarks/k6.ts
New Ruby orchestrator and TypeScript k6 script: route discovery/validation, warmup, per-route k6 runs, JSON export parsing, metric extraction (RPS, p50/p90/p99, max, status breakdown), and BMF export.
Node Renderer Benchmarking
benchmarks/bench-node-renderer.rb
Vegeta-based Node renderer benchmark: discovers production bundles, classifies RSC vs non-RSC, constructs render requests, runs per-bundle h2c attacks, aggregates metrics, and emits BMF-compatible output.
Benchmark Config & Helpers
benchmarks/lib/benchmark_config.rb, benchmarks/lib/benchmark_helpers.rb
Shared env parsing/validation (RATE, CONNECTIONS, MAX_CONNECTIONS, DURATION, REQUEST_TIMEOUT, OUTDIR), tooling checks, server readiness logic, JSON parsing, summary helpers, and CLI-friendly output.
BMF Collector & Report Processing
benchmarks/lib/bmf_helpers.rb, benchmarks/split_html_report.rb
BmfCollector class to collect/write Bencher Metric Format JSON (merge/append support, failure % calc) and HTML splitter to chunk Bencher HTML reports for GitHub comment limits.
Dummy App Production (Core)
react_on_rails/spec/dummy/bin/prod, react_on_rails/spec/dummy/bin/prod-assets, react_on_rails/spec/dummy/config/puma.rb, react_on_rails/spec/dummy/config/shakapacker.yml
Prod start/build scripts with manifest freshness checks; Puma production worker/preload and on_worker_boot hooks; extract_css enabled in shakapacker.
Dummy App Production (Pro)
react_on_rails_pro/spec/dummy/bin/prod, react_on_rails_pro/spec/dummy/bin/prod-assets, react_on_rails_pro/spec/dummy/Procfile.prod, react_on_rails_pro/spec/dummy/config/..., react_on_rails_pro/spec/dummy/config/puma.rb, react_on_rails_pro/spec/dummy/config/shakapacker.yml, react_on_rails_pro/spec/dummy/config/database.yml
Prod scripts with supervisor fallback (overmind→foreman→install), Procfile for Rails + Node renderer, Puma thread min/max and worker_shutdown_timeout, shakapacker cache/versioning tweaks, and DB pool bound to RAILS_MAX_THREADS.
Docs & Contribution Guidance
CLAUDE.md, CONTRIBUTING.md, docs/planning/library-benchmarking.md, CHANGELOG.md, react_on_rails_pro/CHANGELOG.md
Adds pre-commit YAML/action lint guidance, contributor benchmarking docs, library benchmarking plan, and changelog entries describing CI benchmarking.
Tooling / Config / Ignore / Dependencies
\.gitignore, knip.ts, package.json, react_on_rails_pro/Gemfile.development_dependencies
Ignore bench_results, add benchmarks/k6.ts to workspace entries, expand bin ignore pattern, add @types/k6 devDependency, remove uglifier from Pro dev deps.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    actor GH as GitHub Actions
    participant WF as Benchmark Workflow
    participant Tools as Tool Installer (k6, Vegeta, Bencher)
    participant Builder as Build & Start (Core / Pro)
    participant Runner as Load Test (k6 / Vegeta)
    participant App as App Servers (Rails / Node Renderer)
    participant Collector as BmfCollector / Bencher
    participant GHPR as PR / Job Summary

    GH->>WF: trigger (push / PR / manual)
    WF->>Tools: install and configure benchmarking tools
    WF->>Builder: build assets, publish packages, start Core & Pro servers
    Builder-->>WF: ready signal
    WF->>Runner: run Core benchmarks (k6) per-route
    Runner->>App: HTTP requests (per-route)
    App-->>Runner: responses (status, latency)
    Runner->>Collector: aggregate metrics (RPS, p50/p90/p99, status)
    WF->>Runner: run Pro benchmarks (Vegeta) per-bundle
    Runner->>App: per-bundle render requests (h2c)
    App-->>Runner: responses
    Runner->>Collector: append metrics (BMF)
    WF->>Collector: upload BMF to Bencher, fetch HTML report
    WF->>WF: split HTML if needed
    WF->>GHPR: post job summary and report chunks
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested reviewers

  • justin808
  • AbanoubGhadban

Poem

🐰 I hopped through CI with a measuring cup,
K6 and Vegeta made the metrics sup,
Bundles raced, latencies took flight,
Reports split neat, posted in the night,
A little rabbit cheers the perf-run sight!

🚥 Pre-merge checks | ✅ 3 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Out of Scope Changes check ❓ Inconclusive Most changes are in-scope for performance testing infrastructure. However, some configuration changes (Puma thread settings, Shakapacker CSS extraction, production environment setup) extend beyond explicit performance testing scope into production setup. Clarify whether production configuration changes (puma.rb, shakapacker.yml, environments/production.rb, database.yml) are prerequisites for benchmarking or separate concerns that should be split into a dedicated PR.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add performance tests' directly aligns with the main changeset, which introduces a comprehensive benchmarking infrastructure including GitHub Actions workflow, k6 benchmarks, Vegeta benchmarks, and related configuration files.
Linked Issues check ✅ Passed The PR fulfills issue #1777's requirement to 'Add performance tests for the dummy app using K6' by introducing k6 benchmarking (benchmarks/k6.ts, benchmarks/bench.rb), plus comprehensive testing infrastructure with Vegeta benchmarks, GitHub Actions workflow, and configuration support.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch alexeyr/performance-tests

🧹 Recent nitpick comments
.github/workflows/benchmark.yml (2)

540-544: Edge case: github.event.before may be invalid for certain push events.

For the first push to a branch or a force push, github.event.before can be all zeros (0000000000000000000000000000000000000000), which would cause Bencher to fail or produce incorrect baseline comparisons.

Consider adding validation similar to the workflow_dispatch case:

🔧 Suggested improvement
          if [ "${{ github.event_name }}" = "push" ]; then
            BRANCH="master"
            START_POINT="master"
            START_POINT_HASH="${{ github.event.before }}"
+           # Handle initial push or force push where before is all zeros
+           if [ "$START_POINT_HASH" = "0000000000000000000000000000000000000000" ]; then
+             echo "⚠️ Push event has no valid previous commit (initial or force push)"
+             START_POINT_HASH=""
+           fi
            EXTRA_ARGS=""

670-674: Ensure file ends with a newline character.

Based on learnings, files should always end with a newline character. Verify that this file has a trailing newline after the final fi.


📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1204082 and 480acbf.

📒 Files selected for processing (1)
  • .github/workflows/benchmark.yml
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2026-01-15T02:58:44.584Z
Learnt from: CR
Repo: shakacode/react_on_rails PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-15T02:58:44.584Z
Learning: Applies to **/* : ALWAYS ensure files end with a newline character before pushing

Applied to files:

  • .github/workflows/benchmark.yml
📚 Learning: 2025-10-23T17:22:01.074Z
Learnt from: AbanoubGhadban
Repo: shakacode/react_on_rails PR: 1875
File: lib/react_on_rails/utils.rb:112-124
Timestamp: 2025-10-23T17:22:01.074Z
Learning: In React on Rails, when Pro is installed but not licensed, the intended behavior is to raise an error on boot. The `react_on_rails_pro?` method validates licenses and should raise errors early (including during path resolution in methods like `server_bundle?`) to enforce licensing requirements rather than failing later with obscure errors.

Applied to files:

  • .github/workflows/benchmark.yml
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (13)
  • GitHub Check: pro-lint-js-and-ruby
  • GitHub Check: build-dummy-app-webpack-test-bundles
  • GitHub Check: build-dummy-app-webpack-test-bundles (3.2, 20, minimum)
  • GitHub Check: rspec-package-tests (3.4, latest)
  • GitHub Check: rspec-package-tests (3.2, minimum)
  • GitHub Check: examples (3.4, latest)
  • GitHub Check: examples (3.2, minimum)
  • GitHub Check: build-dummy-app-webpack-test-bundles
  • GitHub Check: build
  • GitHub Check: precompile-check
  • GitHub Check: check-bundle-size
  • GitHub Check: benchmark
  • GitHub Check: claude-review
🔇 Additional comments (2)
.github/workflows/benchmark.yml (2)

1-105: Well-structured benchmark workflow with comprehensive configuration.

The workflow is well-organized with:

  • Clear section comments for each major step
  • Flexible inputs for workflow_dispatch with sensible defaults
  • Proper fork protection in the job condition (line 92)
  • Minimal required permissions
  • Conditional execution flags (RUN_CORE, RUN_PRO, etc.) for selective benchmarking

The overall structure follows CI best practices for reproducibility and maintainability.


532-607: Solid Bencher integration with comprehensive threshold configuration.

The Bencher tracking step effectively:

  • Handles all three event types (push, pull_request, workflow_dispatch) with appropriate branch/baseline logic
  • Uses the GitHub API for merge-base detection in workflow_dispatch, avoiding shallow fetch issues
  • Configures thresholds for multiple metrics (rps, p50/p90/p99 latency, failed_pct)
  • Captures exit code to fail the workflow on regression alerts

The HTML report generation and PR comment chunking pattern handles GitHub's size limits gracefully with proper fallback.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


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 and usage tips.

@alexeyr-ci2 alexeyr-ci2 changed the title Alexeyr/performance tests Add performance tests Oct 20, 2025
@alexeyr-ci alexeyr-ci force-pushed the alexeyr/performance-tests branch from 980a424 to 4a01be4 Compare October 20, 2025 19:01
@alexeyr-ci2 alexeyr-ci2 force-pushed the alexeyr/performance-tests branch 5 times, most recently from ec26e73 to a616cd1 Compare November 5, 2025 11:54
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented Nov 5, 2025

Code Review - PR #1868: Add Performance Tests

Thanks for this contribution! This is a solid implementation of performance testing infrastructure.


✅ Strengths

  1. Comprehensive Tool Coverage: Using three industry-standard tools (Fortio, Vegeta, k6) provides good cross-validation
  2. Well-Structured Workflow: Clear separation of concerns with logical step grouping
  3. Good Error Handling: Proper use of set -euo pipefail and validation steps
  4. Caching Strategy: Smart use of GitHub Actions cache for benchmark tool binaries
  5. Security Conscious: SSH access properly gated with warnings and actor-only access
  6. Flexible Configuration: Parameterized inputs allow customization

🐛 Critical Issues

  1. Node.js Version Mismatch (benchmark.yml:155)

  2. Missing Trailing Newlines (CRITICAL per CLAUDE.md)

    • Files spec/dummy/bin/prod and spec/dummy/bin/prod-assets missing final newlines
    • This will cause CI failures - Run: rake autofix to fix
  3. Race Condition in Server Startup (benchmark.yml:220)

    • Background server might not be fully initialized when curl check succeeds
    • Recommend adding health check endpoint or verifying multiple successful responses
  4. Incomplete PR Checklist

    • Documentation and CHANGELOG boxes unchecked
    • Per CLAUDE.md: Should update CHANGELOG for user-visible features

⚠️ Performance & Quality Issues

  1. bench.sh:66 - Unrealistic iteration count assumes 10 iterations/sec per VU
  2. Fortio Optimization Missing - Referenced guide not implemented
  3. No Resource Monitoring - Missing CPU/memory metrics
  4. Missing Test Validation - No thresholds to detect performance regressions
  5. Single Route Testing - Only tests server_side_hello_world_hooks
  6. Complex Validation Logic - Lines 17-27 hard to read
  7. Inconsistent Quoting - Variables not consistently quoted
  8. Hard-coded Timeouts - 30s and 60s timeouts not configurable

📚 Documentation Issues

  1. Missing Documentation - No README for running benchmarks locally
  2. Workflow Triggers - Runs on ALL PRs (expensive, should use labels/manual only)
  3. No Historical Tracking - Results not compared over time

🎯 Before Merging

  1. Fix Node.js version (22 → 20)
  2. Add trailing newlines
  3. Run bundle exec rubocop
  4. Update CHANGELOG.md
  5. Add performance thresholds
  6. Update workflow triggers

📊 Summary

Assessment: Good foundation but needs critical fixes before merge

Effort: Critical issues ~30 mins, High priority ~1-2 hours

Main concerns: Node.js version mismatch and missing trailing newlines will cause CI failures.

Let me know if you need help with any of these!

@alexeyr-ci2 alexeyr-ci2 force-pushed the alexeyr/performance-tests branch 5 times, most recently from 040c0a5 to ad56e14 Compare November 5, 2025 15:49
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented Nov 5, 2025

PR Review: Add Performance Tests (1868)

Summary

This PR adds comprehensive performance testing infrastructure using three industry-standard benchmarking tools (Fortio, Vegeta, and k6). Well-structured implementation addressing issue 1777.

Critical Issues

1. Missing Trailing Newlines

CRITICAL per CLAUDE.md: Files MUST end with newline character or CI will fail:

  • spec/dummy/bin/prod (line 4)
  • spec/dummy/bin/prod-assets (line 9)
  • spec/performance/bench.sh (line 202)

2. RuboCop Required

CRITICAL per CLAUDE.md: Must run bundle exec rubocop and fix ALL violations before commit.

Potential Bugs

K6 JSON Parsing (bench.sh:187-192)

The jq expression uses add which fails on empty arrays. Use add // 0 for safety.

Server Startup Race (benchmark.yml:254)

Uses exit 0 inside loop which exits the entire step. Should use break instead.

npm vs yarn (benchmark.yml:200)

Uses npm install --global yalc but CLAUDE.md requires yarn-only commands.

Code Quality Strengths

  1. Excellent tool selection - three benchmarking tools for cross-validation
  2. Well-structured workflow with clear sections
  3. Good error handling with set -euo pipefail
  4. Comprehensive parameterization via workflow inputs
  5. Smart binary caching for faster CI
  6. Security-conscious SSH access gating

Suggestions

  1. Shell portability: Replace bc with awk for float comparisons
  2. Hardcoded route: Make server_side_hello_world_hooks configurable
  3. Duration: 30s may be too short, consider 60s for stable measurements
  4. Add documentation for local benchmark execution
  5. Consider performance regression detection vs master
  6. Add spec/performance/README.md with interpretation guide

Test Coverage

Good: Infrastructure in place, runs on PR/push, results preserved as artifacts
Missing: No bash script tests, no performance thresholds, no local testing docs

Verdict

Solid PR with high code quality. Performance testing infrastructure will be valuable.

Required Before Merge:

  1. Fix trailing newlines (will cause CI failure)
  2. Run bundle exec rubocop and fix violations
  3. Fix K6 empty array bug

Recommended:

  1. Add basic documentation
  2. Verify workflow passes on CI
  3. Consider CHANGELOG entry

Great work overall!

@alexeyr-ci2 alexeyr-ci2 force-pushed the alexeyr/performance-tests branch 2 times, most recently from e350a34 to 7b9d621 Compare November 6, 2025 10:25
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented Nov 6, 2025

PR Review: Add Performance Tests

Thank you for this comprehensive performance testing implementation! This is a well-structured addition to the repository. Here's my detailed feedback:


Strengths

  1. Comprehensive Tool Coverage: Great choice using three different load testing tools (Fortio, Vegeta, k6) to get diverse perspectives on performance
  2. Excellent Error Handling: The bash script has robust parameter validation and error handling throughout
  3. Smart Caching: GitHub Actions workflow efficiently caches binaries to speed up future runs
  4. Good Documentation: Clear comments, parameter descriptions, and helpful echo statements
  5. Configurable Parameters: Extensive workflow_dispatch inputs allow flexible testing scenarios
  6. Production-Ready Setup: Proper Puma configuration with workers and preloading for production benchmarks

🐛 Potential Issues

1. Script Portability - bc Dependency (bench.sh:21,33)

The script uses bc for floating-point comparisons but bc is not installed in the workflow.

Fix: Add bc to the apt package installation step in the workflow, or use bash-native arithmetic for integer comparisons.

2. Race Condition in Server Startup (benchmark.yml:248)

The server process is backgrounded but there is no guarantee it has started before the polling loop begins. If the server fails to start immediately, the loop might miss error messages.

Suggestion: Add a brief sleep 2 before the polling loop, or capture the PID and check if the process is still running during the timeout loop.

3. k6 Status Reporting Edge Case (bench.sh:199-204)

If .root_group.checks is empty, add returns null, causing K6_REQS_OTHER calculation to fail.

Fix: Add null handling by changing the jq expression to use | add // 0

4. Missing Newline at End of Files

Per CLAUDE.md requirements: ALWAYS ensure files end with a newline character

Files needing newlines:

  • spec/dummy/bin/prod (line 4)
  • spec/dummy/bin/prod-assets (line 9)
  • spec/performance/bench.sh (line 214)

Fix: Run rake autofix or add trailing newlines manually.

5. Benchmark Workflow Runs on Every PR (benchmark.yml:57-58)

Running 30-second benchmarks with 3 tools on every PR will consume significant CI minutes and slow down PR feedback.

Suggestion:

  • Remove pull_request trigger and only keep workflow_dispatch + push to master
  • Or add a condition to only run on PRs with a specific label (e.g., performance)
  • Or significantly reduce default duration (e.g., 10s) for PR runs

🔍 Code Quality & Best Practices

Security

  • ✅ SSH access is properly gated behind workflow_dispatch input with clear warnings
  • ✅ limit-access-to-actor: true prevents unauthorized access
  • ⚠️ Consider adding a comment warning maintainers never to merge code while SSH session is active

Performance

  • ✅ Binary caching will significantly speed up repeated runs
  • ✅ Server warm-up phase (10 requests) is good practice
  • ⚠️ REQUEST_TIMEOUT=60s is very generous - consider 30s default to catch timeout issues faster

Maintainability

  • ✅ Clear section comments in YAML
  • ✅ Parameterized configuration
  • ⚠️ Consider extracting the jq parsing logic (lines 167-209) into a separate function for readability

📊 Test Coverage

Missing:

  • ❌ No automated tests for the bench.sh script itself
  • ❌ No validation that the summary.txt format is correct
  • ❌ No performance regression detection (just data collection)

Suggestions:

  1. Add a unit test for bench.sh parameter validation
  2. Consider storing benchmark results over time and comparing against baselines
  3. Add a step to post benchmark results as a PR comment for visibility

🔧 Configuration Issues

Puma Configuration (spec/dummy/config/puma.rb:38)

Workflow sets default to 4 workers (WEB_CONCURRENCY: 4), but Puma defaults to 2 if not set. The workflow default should match.

Consistency check needed: Verify that WEB_CONCURRENCY=4 is intentional for CI runners with 2 CPU cores.


📝 Documentation & Changelog

Per CLAUDE.md: Update CHANGELOG.md for user-visible changes only (features, bug fixes, breaking changes, deprecations, performance improvements)

This PR qualifies as it adds a performance testing feature. Needs:

  • ✅ Changelog entry format: PR 1868 by alexeyr-ci2: Add performance benchmarking workflow with Fortio, Vegeta, and k6.

Missing:

  • ❌ No README/docs update explaining how to run benchmarks locally
  • ❌ No documentation on interpreting benchmark results

🎯 Recommendations

Before Merge (Critical):

  1. ✅ Add trailing newlines to all new files
  2. ✅ Run bundle exec rubocop and fix any violations
  3. ✅ Add CHANGELOG entry
  4. ✅ Fix k6 null handling edge case
  5. ✅ Reconsider pull_request trigger or reduce duration

Nice to Have:
6. Add bc to dependencies or remove floating-point support
7. Add brief README section on running benchmarks
8. Handle server startup race condition
9. Consider performance regression detection


🎓 Overall Assessment

This is a solid, production-ready implementation of performance testing. The code quality is high, with excellent error handling and configurability. The main concerns are:

  1. CI cost - running on every PR may be expensive
  2. Missing documentation - users won't know how to use this
  3. File formatting - needs trailing newlines per repo standards

Recommendation: Request changes for the critical items (newlines, changelog, PR trigger), then approve.


Score: 8/10 - Great implementation, minor issues to address.

@alexeyr-ci2 alexeyr-ci2 force-pushed the alexeyr/performance-tests branch from 7b9d621 to f2b9ef8 Compare November 7, 2025 13:13
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented Nov 7, 2025

Pull Request Review: Add Performance Tests

Thank you for this comprehensive performance testing implementation! This is a valuable addition to the project. Below is my detailed review:


Strengths

  1. Multi-tool approach: Using Fortio, Vegeta, and K6 provides cross-validation of results and flexibility for different testing scenarios.

  2. Well-structured workflow: The GitHub Actions workflow is logically organized with clear steps and helpful comments.

  3. Configurable parameters: Extensive configurability via workflow inputs allows fine-tuning for different performance scenarios.

  4. Good error handling: The bench.sh script includes comprehensive input validation and error messages.

  5. Caching: Binary caching for tools reduces workflow execution time.

  6. Production mode testing: Tests against production-like configuration (Puma workers, precompiled assets) for realistic results.


🔍 Issues and Concerns

Critical Issues

  1. Missing file newlines (spec/dummy/bin/prod, spec/dummy/bin/prod-assets)

    • Location: spec/dummy/bin/prod:4, spec/dummy/bin/prod-assets:9
    • Impact: CI will fail per CLAUDE.md requirements
    • Fix: Ensure both files end with a newline character
    • Reference: CLAUDE.md states "ALWAYS ensure files end with a newline character"
  2. RuboCop not run

    • Impact: MANDATORY requirement before commits
    • Required action: Run bundle exec rubocop and fix ALL violations
    • Reference: CLAUDE.md: "BEFORE EVERY COMMIT/PUSH: ALWAYS run bundle exec rubocop and fix ALL violations"

High Priority Issues

  1. Workflow runs on every PR/push to master (benchmark.yml:55-58)

    • Impact: Performance tests are resource-intensive and will slow down CI significantly
    • Recommendation: Only run on manual workflow_dispatch, specific labels (e.g., run-benchmarks), or scheduled runs (e.g., nightly)
  2. Server process not properly cleaned up (benchmark.yml:248)

    • Issue: Server started in background with bin/prod & but never explicitly killed
    • Impact: May leave orphaned processes, especially if workflow fails
    • Fix: Add cleanup step or use a trap/signal handler

Medium Priority Issues

  1. Hardcoded route in bench.sh (line 6)

    • Issue: ROUTE:-server_side_hello_world_hooks may not exist or may not be representative
    • Recommendation: Verify this route exists in the dummy app, consider testing multiple routes, and document what this route tests
  2. No baseline comparison

    • Issue: Results are collected but not compared against previous runs
    • Enhancement: Consider using benchmark-action to track performance over time
  3. Missing documentation

    • Issue: No README or documentation for how to run benchmarks locally, interpret results, or understand what "good" performance looks like
    • Recommendation: Add spec/performance/README.md

🔒 Security Considerations

  1. SSH access via tmate (benchmark.yml:108-113)
    • Status: Properly gated behind workflow input (default: false)
    • Good: Includes security warnings and limit-access-to-actor

🧪 Test Coverage

Missing:

  • No unit tests for the bash script logic
  • No tests verifying the benchmark workflow succeeds
  • No validation that summary output format is correct

Recommendations:

  • Add a dry-run mode to bench.sh for testing
  • Consider shellcheck for bash script validation

📝 Suggested Changes

Must Fix (Blocks Merge)

  • Add trailing newlines to spec/dummy/bin/prod and spec/dummy/bin/prod-assets
  • Run bundle exec rubocop and fix all violations
  • Change workflow triggers to avoid running on every PR/push

Should Fix (High Priority)

  • Add server cleanup/shutdown in workflow
  • Verify the benchmark route exists and is representative
  • Add basic documentation (spec/performance/README.md)

Nice to Have

  • Add baseline comparison/tracking
  • Add shellcheck to CI for bash scripts
  • Consider shorter default duration for PR checks
  • Extract K6 test to separate file

Changelog

Per CLAUDE.md, this should be added to CHANGELOG.md as it's a new feature.


🎯 Overall Assessment

This is a solid foundation for performance testing with good multi-tool coverage and configurability. The main blockers are CLAUDE.md compliance issues (trailing newlines, RuboCop). Once those are fixed and the workflow triggers are adjusted to avoid running on every PR, this will be ready to merge.

Estimated effort to address critical issues: ~30 minutes

Great work overall! 🚀

@alexeyr-ci2 alexeyr-ci2 force-pushed the alexeyr/performance-tests branch from c58f480 to 43f8858 Compare November 7, 2025 13:36
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented Nov 7, 2025

Code Review: Add Performance Tests

Thank you for this comprehensive performance testing addition! This is a well-structured PR that addresses issue #1777.


✅ Strengths

1. Excellent Tool Coverage

  • Multiple benchmarking tools (Fortio, Vegeta, k6) provide good cross-validation
  • Smart caching strategy for tool binaries reduces CI time
  • Flexible configuration via environment variables

2. Robust Error Handling

  • Good use of set -euo pipefail in bash scripts
  • Comprehensive input validation with clear error messages
  • Server health checks with timeout protection

3. Production-Ready Configuration

  • Proper Puma clustering setup for production benchmarks
  • Preloading and worker configuration aligned with best practices
  • Appropriate separation of prod/dev configurations

🔒 Security Concerns - CRITICAL

SSH Access Feature (lines 96-119 in .github/workflows/benchmark.yml)

This poses significant security risks:

Issues:

  1. Detached mode risk: Using detached: true leaves the SSH session open indefinitely
  2. Repository exposure: The entire repository is accessible via SSH
  3. No audit trail: Limited visibility into commands executed during SSH sessions
  4. Secrets exposure risk: If secrets are added later, they could be exposed

Recommendations:

  • Consider removing this feature entirely for production workflows
  • If kept: Remove detached: true, add timeout-minutes: 15, and restrict to non-master branches
  • Document that NO secrets should ever be added to this workflow

🐛 Potential Bugs

1. Division by Zero Risk (spec/performance/bench.sh:195-197)

If K6_REQS_KNOWN_STATUS is null/empty, this could fail. Add validation.

2. Race Condition in Server Startup (spec/dummy/bin/prod)

The rails s command starts but there is no guarantee assets are fully loaded. Consider adding a readiness check that validates asset serving.

3. Missing Error Context

When benchmarks fail, the error message does not indicate which tool failed. Consider wrapping each tool execution with proper error context.

4. Hardcoded Paths (spec/performance/bench.sh:87)

If run from wrong directory, this could create directories in unexpected locations. Consider using SCRIPT_DIR to make paths relative to the script location.


⚡ Performance Considerations

  1. Workflow runs on every push/PR: For a 20-minute benchmark suite, consider only running on workflow_dispatch and push to master, or add path filters to skip documentation changes.

  2. Sequential warmup (spec/performance/bench.sh:73-78): Consider parallel warmup for efficiency.

  3. Triple tool execution: Running all 3 tools provides validation but triples execution time. Consider defaulting to k6 only.


🧪 Test Coverage - Missing

  1. Unit tests for benchmark script: Input validation and JSON parsing logic should be tested
  2. Workflow validation: Consider adding actionlint to CI
  3. Integration test: Should verify benchmark artifacts are generated correctly

📝 Documentation - REQUIRED

Missing per CLAUDE.md requirements:

  1. CHANGELOG.md update - This is a user-visible feature that developers will use. Action needed: Update CHANGELOG.md

  2. Inline documentation: spec/performance/bench.sh needs header comment explaining:

    • Purpose
    • Usage examples
    • Required dependencies
    • Expected output format
  3. Workflow documentation: Add comment block in .github/workflows/benchmark.yml explaining when to run benchmarks and how to interpret results


🎨 Code Quality Suggestions

Good Practices:

  • Consistent error handling
  • Input validation with clear messages
  • Proper use of environment variables with defaults
  • JSON output for machine-readable results

Suggestions:

  1. YAML Anchors: Lines 7-14 define anchors but only use them once - consider simplifying
  2. DRY Principle: Lines 165-208 have very similar blocks for each tool - consider refactoring
  3. Magic Numbers: Several hardcoded values should be configurable (TIMEOUT_SEC=60, warmup count, sleep durations)
  4. Puma Configuration: Default of 2 workers may be too low - document why this was chosen

📋 Action Items Summary

🔴 High Priority (Before Merge):

  1. Address SSH security concerns - Remove or significantly restrict
  2. Add CHANGELOG.md entry (required per project guidelines)
  3. Fix potential null reference in K6 status parsing
  4. Add workflow path filters to prevent unnecessary runs

🟡 Medium Priority (Before Merge):

  1. Add header documentation to bench.sh
  2. Add error context to benchmark failures
  3. Fix hardcoded paths in bash script

🟢 Low Priority (Future Enhancement):

  1. Add unit tests for benchmark script
  2. Refactor duplicate code in parsing logic
  3. Make magic numbers configurable

✨ Overall Assessment

This is a solid foundation for performance testing! The multi-tool approach and comprehensive workflow setup show good engineering practices.

Main concerns:

  1. Security: SSH feature needs significant changes or removal
  2. Documentation: Missing CHANGELOG and inline docs (required per CLAUDE.md)
  3. Robustness: A few edge cases in error handling

Recommendation: Request changes for security and documentation issues, then approve after those are addressed.

Great work on this comprehensive testing infrastructure!

@alexeyr-ci2 alexeyr-ci2 force-pushed the alexeyr/performance-tests branch 8 times, most recently from be4af9e to 564b8b6 Compare November 7, 2025 20:20
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented Jan 15, 2026

📊 Bencher Integration Quality

1. Threshold ConfigurationEXCELLENT

The 30% regression threshold is reasonable for library benchmarking in shared CI infrastructure. The configuration correctly uses:

  • Lower boundary for RPS (higher is better)
  • Upper boundary for latencies (lower is better)
  • Multiple percentiles tracked (p50, p90, p99) for comprehensive analysis

2. HTML Report SplittingCLEVER SOLUTION

split_html_report.rb:

  • Handles GitHub's 65KB PR comment limit (uses 220KB safety margin for HTML compression)
  • Preserves table structure across chunks
  • Deletes old comments before posting new ones
  • Falls back gracefully if chunks are too large

Minor improvement: Could add chunk numbering to comments for clarity.

🎯 Recommendations Summary

Must Fix (Blocking)

  1. CHANGELOG decision: Either remove the entry (preferred per CLAUDE.md guidelines) or enhance it with more context

Should Fix (Pre-merge)

  1. Documentation: Add troubleshooting section to CONTRIBUTING.md
  2. Safety: Add CI-only check to aggressive process cleanup step

Nice to Have (Post-merge)

  1. Refactoring: Break down large methods in bench-node-renderer.rb
  2. Memory metrics: Consider adding in future iteration
  3. Cache optimization: Monitor and adjust artifact retention policies
  4. Chunk numbering: Add to split HTML reports for clarity

🏆 Final Verdict

Status: ✅ APPROVE WITH MINOR CHANGES

This is excellent work that significantly improves the project's testing infrastructure. The code quality is high, the design is thoughtful, and the documentation is comprehensive. The only blocking issue is the CHANGELOG entry decision, which is a quick fix.

Estimated effort to address blocking issues: 5 minutes

Confidence level: High - this is production-ready infrastructure code with proper error handling and validation.


Great job on this implementation, @alexeyr-ci2! The benchmark infrastructure will be valuable for detecting performance regressions and improving React on Rails quality. 🎉

@github-actions
Copy link
Copy Markdown
Contributor

🐰 Bencher Report

Branchalexeyr/performance-tests
Testbedgithub-actions
Click to view all benchmark results
Benchmarkfailed_pctBenchmark Result
%
(Result Δ%)
Upper Boundary
%
(Limit %)
p50_latencyBenchmark Result
ms
(Result Δ%)
Upper Boundary
ms
(Limit %)
p90_latencyBenchmark Result
ms
(Result Δ%)
Upper Boundary
ms
(Limit %)
p99_latencyBenchmark Result
ms
(Result Δ%)
Upper Boundary
ms
(Limit %)
rpsBenchmark Result
req/s
(Result Δ%)
Lower Boundary
req/s
(Limit %)
/: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
2,398.75
(0.00%)Baseline: 2,398.75
3,118.38
(76.92%)
📈 view plot
🚷 view threshold
3,668.98
(0.00%)Baseline: 3,668.98
4,769.67
(76.92%)
📈 view plot
🚷 view threshold
34,193.34
(0.00%)Baseline: 34,193.34
44,451.34
(76.92%)
📈 view plot
🚷 view threshold
2.54
(0.00%)Baseline: 2.54
1.78
(70.00%)
/: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
12.89
(0.00%)Baseline: 12.89
16.76
(76.92%)
📈 view plot
🚷 view threshold
40.17
(0.00%)Baseline: 40.17
52.22
(76.92%)
📈 view plot
🚷 view threshold
852.61
(0.00%)Baseline: 852.61
1,108.39
(76.92%)
📈 view plot
🚷 view threshold
164.84
(0.00%)Baseline: 164.84
115.39
(70.00%)
/apollo_graphql: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
44.33
(0.00%)Baseline: 44.33
57.63
(76.92%)
📈 view plot
🚷 view threshold
117.60
(0.00%)Baseline: 117.60
152.88
(76.92%)
📈 view plot
🚷 view threshold
585.28
(0.00%)Baseline: 585.28
760.86
(76.92%)
📈 view plot
🚷 view threshold
124.55
(0.00%)Baseline: 124.55
87.19
(70.00%)
/async_components_demo: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
30.93
(0.00%)Baseline: 30.93
40.21
(76.92%)
📈 view plot
🚷 view threshold
45.02
(0.00%)Baseline: 45.02
58.53
(76.92%)
📈 view plot
🚷 view threshold
407.52
(0.00%)Baseline: 407.52
529.78
(76.92%)
📈 view plot
🚷 view threshold
254.10
(0.00%)Baseline: 254.10
177.87
(70.00%)
/async_on_server_sync_on_client: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
16.47
(0.00%)Baseline: 16.47
21.41
(76.92%)
📈 view plot
🚷 view threshold
28.06
(0.00%)Baseline: 28.06
36.48
(76.92%)
📈 view plot
🚷 view threshold
260.16
(0.00%)Baseline: 260.16
338.21
(76.92%)
📈 view plot
🚷 view threshold
392.72
(0.00%)Baseline: 392.72
274.90
(70.00%)
/async_on_server_sync_on_client_client_render: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
16.63
(0.00%)Baseline: 16.63
21.62
(76.92%)
📈 view plot
🚷 view threshold
26.08
(0.00%)Baseline: 26.08
33.90
(76.92%)
📈 view plot
🚷 view threshold
171.08
(0.00%)Baseline: 171.08
222.40
(76.92%)
📈 view plot
🚷 view threshold
460.97
(0.00%)Baseline: 460.97
322.68
(70.00%)
/async_render_function_returns_component: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.90
(0.00%)Baseline: 17.90
23.27
(76.92%)
📈 view plot
🚷 view threshold
28.19
(0.00%)Baseline: 28.19
36.65
(76.92%)
📈 view plot
🚷 view threshold
201.61
(0.00%)Baseline: 201.61
262.09
(76.92%)
📈 view plot
🚷 view threshold
441.07
(0.00%)Baseline: 441.07
308.75
(70.00%)
/async_render_function_returns_string: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
20.14
(0.00%)Baseline: 20.14
26.18
(76.92%)
📈 view plot
🚷 view threshold
28.16
(0.00%)Baseline: 28.16
36.61
(76.92%)
📈 view plot
🚷 view threshold
110.03
(0.00%)Baseline: 110.03
143.04
(76.92%)
📈 view plot
🚷 view threshold
437.08
(0.00%)Baseline: 437.08
305.96
(70.00%)
/broken_app: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
386.32
(0.00%)Baseline: 386.32
502.22
(76.92%)
📈 view plot
🚷 view threshold
437.39
(0.00%)Baseline: 437.39
568.61
(76.92%)
📈 view plot
🚷 view threshold
3,160.19
(0.00%)Baseline: 3,160.19
4,108.25
(76.92%)
📈 view plot
🚷 view threshold
23.40
(0.00%)Baseline: 23.40
16.38
(70.00%)
/broken_app: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
18.80
(0.00%)Baseline: 18.80
24.44
(76.92%)
📈 view plot
🚷 view threshold
30.29
(0.00%)Baseline: 30.29
39.38
(76.92%)
📈 view plot
🚷 view threshold
160.08
(0.00%)Baseline: 160.08
208.10
(76.92%)
📈 view plot
🚷 view threshold
414.83
(0.00%)Baseline: 414.83
290.38
(70.00%)
/cached_react_helmet: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.82
(0.00%)Baseline: 17.82
23.17
(76.92%)
📈 view plot
🚷 view threshold
59.64
(0.00%)Baseline: 59.64
77.53
(76.92%)
📈 view plot
🚷 view threshold
258.08
(0.00%)Baseline: 258.08
335.50
(76.92%)
📈 view plot
🚷 view threshold
302.71
(0.00%)Baseline: 302.71
211.90
(70.00%)
/cached_redux_component: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.15
(0.00%)Baseline: 17.15
22.30
(76.92%)
📈 view plot
🚷 view threshold
32.80
(0.00%)Baseline: 32.80
42.64
(76.92%)
📈 view plot
🚷 view threshold
158.17
(0.00%)Baseline: 158.17
205.62
(76.92%)
📈 view plot
🚷 view threshold
420.43
(0.00%)Baseline: 420.43
294.30
(70.00%)
/client_side_hello_world: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
11.31
(0.00%)Baseline: 11.31
14.70
(76.92%)
📈 view plot
🚷 view threshold
14.78
(0.00%)Baseline: 14.78
19.21
(76.92%)
📈 view plot
🚷 view threshold
131.56
(0.00%)Baseline: 131.56
171.03
(76.92%)
📈 view plot
🚷 view threshold
517.30
(0.00%)Baseline: 517.30
362.11
(70.00%)
/client_side_hello_world: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
16.61
(0.00%)Baseline: 16.61
21.59
(76.92%)
📈 view plot
🚷 view threshold
20.12
(0.00%)Baseline: 20.12
26.16
(76.92%)
📈 view plot
🚷 view threshold
333.70
(0.00%)Baseline: 333.70
433.81
(76.92%)
📈 view plot
🚷 view threshold
348.68
(0.00%)Baseline: 348.68
244.08
(70.00%)
/client_side_hello_world_shared_store: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
10.58
(0.00%)Baseline: 10.58
13.75
(76.92%)
📈 view plot
🚷 view threshold
23.15
(0.00%)Baseline: 23.15
30.09
(76.92%)
📈 view plot
🚷 view threshold
130.93
(0.00%)Baseline: 130.93
170.21
(76.92%)
📈 view plot
🚷 view threshold
614.87
(0.00%)Baseline: 614.87
430.41
(70.00%)
/client_side_hello_world_shared_store: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.48
(0.00%)Baseline: 17.48
22.72
(76.92%)
📈 view plot
🚷 view threshold
27.47
(0.00%)Baseline: 27.47
35.71
(76.92%)
📈 view plot
🚷 view threshold
190.32
(0.00%)Baseline: 190.32
247.42
(76.92%)
📈 view plot
🚷 view threshold
450.48
(0.00%)Baseline: 450.48
315.34
(70.00%)
/client_side_hello_world_shared_store_controller: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
10.00
(0.00%)Baseline: 10.00
13.00
(76.92%)
📈 view plot
🚷 view threshold
19.85
(0.00%)Baseline: 19.85
25.80
(76.92%)
📈 view plot
🚷 view threshold
117.55
(0.00%)Baseline: 117.55
152.81
(76.92%)
📈 view plot
🚷 view threshold
673.46
(0.00%)Baseline: 673.46
471.42
(70.00%)
/client_side_hello_world_shared_store_controller: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
19.90
(0.00%)Baseline: 19.90
25.87
(76.92%)
📈 view plot
🚷 view threshold
28.04
(0.00%)Baseline: 28.04
36.45
(76.92%)
📈 view plot
🚷 view threshold
115.09
(0.00%)Baseline: 115.09
149.62
(76.92%)
📈 view plot
🚷 view threshold
442.25
(0.00%)Baseline: 442.25
309.58
(70.00%)
/client_side_hello_world_shared_store_defer: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
9.67
(0.00%)Baseline: 9.67
12.57
(76.92%)
📈 view plot
🚷 view threshold
18.26
(0.00%)Baseline: 18.26
23.74
(76.92%)
📈 view plot
🚷 view threshold
150.05
(0.00%)Baseline: 150.05
195.06
(76.92%)
📈 view plot
🚷 view threshold
686.19
(0.00%)Baseline: 686.19
480.33
(70.00%)
/client_side_hello_world_shared_store_defer: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
20.00
(0.00%)Baseline: 20.00
26.00
(76.92%)
📈 view plot
🚷 view threshold
27.67
(0.00%)Baseline: 27.67
35.97
(76.92%)
📈 view plot
🚷 view threshold
113.52
(0.00%)Baseline: 113.52
147.58
(76.92%)
📈 view plot
🚷 view threshold
444.32
(0.00%)Baseline: 444.32
311.02
(70.00%)
/client_side_log_throw: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
8.13
(0.00%)Baseline: 8.13
10.57
(76.92%)
📈 view plot
🚷 view threshold
13.80
(0.00%)Baseline: 13.80
17.94
(76.92%)
📈 view plot
🚷 view threshold
140.41
(0.00%)Baseline: 140.41
182.53
(76.92%)
📈 view plot
🚷 view threshold
756.34
(0.00%)Baseline: 756.34
529.44
(70.00%)
/client_side_log_throw: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
16.66
(0.00%)Baseline: 16.66
21.66
(76.92%)
📈 view plot
🚷 view threshold
25.45
(0.00%)Baseline: 25.45
33.09
(76.92%)
📈 view plot
🚷 view threshold
185.15
(0.00%)Baseline: 185.15
240.69
(76.92%)
📈 view plot
🚷 view threshold
460.76
(0.00%)Baseline: 460.76
322.53
(70.00%)
/client_side_manual_render: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
8.21
(0.00%)Baseline: 8.21
10.67
(76.92%)
📈 view plot
🚷 view threshold
13.60
(0.00%)Baseline: 13.60
17.68
(76.92%)
📈 view plot
🚷 view threshold
132.82
(0.00%)Baseline: 132.82
172.67
(76.92%)
📈 view plot
🚷 view threshold
749.48
(0.00%)Baseline: 749.48
524.64
(70.00%)
/client_side_manual_render: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
16.08
(0.00%)Baseline: 16.08
20.90
(76.92%)
📈 view plot
🚷 view threshold
24.24
(0.00%)Baseline: 24.24
31.51
(76.92%)
📈 view plot
🚷 view threshold
173.09
(0.00%)Baseline: 173.09
225.02
(76.92%)
📈 view plot
🚷 view threshold
477.89
(0.00%)Baseline: 477.89
334.52
(70.00%)
/client_side_rescript_hello_world: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
11.97
(0.00%)Baseline: 11.97
15.56
(76.92%)
📈 view plot
🚷 view threshold
21.16
(0.00%)Baseline: 21.16
27.51
(76.92%)
📈 view plot
🚷 view threshold
74.10
(0.00%)Baseline: 74.10
96.33
(76.92%)
📈 view plot
🚷 view threshold
683.17
(0.00%)Baseline: 683.17
478.22
(70.00%)
/console_logs_in_async_server: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
2,120.11
(0.00%)Baseline: 2,120.11
2,756.14
(76.92%)
📈 view plot
🚷 view threshold
2,150.79
(0.00%)Baseline: 2,150.79
2,796.03
(76.92%)
📈 view plot
🚷 view threshold
23,329.98
(0.00%)Baseline: 23,329.98
30,328.97
(76.92%)
📈 view plot
🚷 view threshold
2.75
(0.00%)Baseline: 2.75
1.93
(70.00%)
/context_function_return_jsx: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
8.76
(0.00%)Baseline: 8.76
11.39
(76.92%)
📈 view plot
🚷 view threshold
21.06
(0.00%)Baseline: 21.06
27.38
(76.92%)
📈 view plot
🚷 view threshold
81.14
(0.00%)Baseline: 81.14
105.48
(76.92%)
📈 view plot
🚷 view threshold
754.22
(0.00%)Baseline: 754.22
527.95
(70.00%)
/context_function_return_jsx: Pro📈 view plot
🚷 view threshold
100.00
(0.00%)Baseline: 100.00
130.00
(76.92%)
📈 view plot
🚷 view threshold
16.35
(0.00%)Baseline: 16.35
21.26
(76.92%)
📈 view plot
🚷 view threshold
25.45
(0.00%)Baseline: 25.45
33.09
(76.92%)
📈 view plot
🚷 view threshold
173.14
(0.00%)Baseline: 173.14
225.08
(76.92%)
📈 view plot
🚷 view threshold
468.06
(0.00%)Baseline: 468.06
327.64
(70.00%)
/css_modules_images_fonts_example: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
350.33
(0.00%)Baseline: 350.33
455.43
(76.92%)
📈 view plot
🚷 view threshold
439.86
(0.00%)Baseline: 439.86
571.82
(76.92%)
📈 view plot
🚷 view threshold
4,008.17
(0.00%)Baseline: 4,008.17
5,210.62
(76.92%)
📈 view plot
🚷 view threshold
23.11
(0.00%)Baseline: 23.11
16.18
(70.00%)
/css_modules_images_fonts_example: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.89
(0.00%)Baseline: 17.89
23.26
(76.92%)
📈 view plot
🚷 view threshold
29.21
(0.00%)Baseline: 29.21
37.97
(76.92%)
📈 view plot
🚷 view threshold
151.99
(0.00%)Baseline: 151.99
197.59
(76.92%)
📈 view plot
🚷 view threshold
430.32
(0.00%)Baseline: 430.32
301.22
(70.00%)
/empty: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
5.37
(0.00%)Baseline: 5.37
6.98
(76.92%)
📈 view plot
🚷 view threshold
7.43
(0.00%)Baseline: 7.43
9.66
(76.92%)
📈 view plot
🚷 view threshold
62.03
(0.00%)Baseline: 62.03
80.64
(76.92%)
📈 view plot
🚷 view threshold
1,069.87
(0.00%)Baseline: 1,069.87
748.91
(70.00%)
/image_example: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
286.55
(0.00%)Baseline: 286.55
372.51
(76.92%)
📈 view plot
🚷 view threshold
429.29
(0.00%)Baseline: 429.29
558.08
(76.92%)
📈 view plot
🚷 view threshold
4,318.00
(0.00%)Baseline: 4,318.00
5,613.40
(76.92%)
📈 view plot
🚷 view threshold
23.11
(0.00%)Baseline: 23.11
16.18
(70.00%)
/image_example: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
21.29
(0.00%)Baseline: 21.29
27.68
(76.92%)
📈 view plot
🚷 view threshold
29.76
(0.00%)Baseline: 29.76
38.69
(76.92%)
📈 view plot
🚷 view threshold
114.29
(0.00%)Baseline: 114.29
148.58
(76.92%)
📈 view plot
🚷 view threshold
415.25
(0.00%)Baseline: 415.25
290.68
(70.00%)
/lazy_apollo_graphql: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
56.73
(0.00%)Baseline: 56.73
73.75
(76.92%)
📈 view plot
🚷 view threshold
92.07
(0.00%)Baseline: 92.07
119.69
(76.92%)
📈 view plot
🚷 view threshold
313.56
(0.00%)Baseline: 313.56
407.63
(76.92%)
📈 view plot
🚷 view threshold
150.42
(0.00%)Baseline: 150.42
105.29
(70.00%)
/loadable: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
20.34
(0.00%)Baseline: 20.34
26.44
(76.92%)
📈 view plot
🚷 view threshold
36.50
(0.00%)Baseline: 36.50
47.45
(76.92%)
📈 view plot
🚷 view threshold
255.86
(0.00%)Baseline: 255.86
332.62
(76.92%)
📈 view plot
🚷 view threshold
356.20
(0.00%)Baseline: 356.20
249.34
(70.00%)
/manual_render_test: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
9.03
(0.00%)Baseline: 9.03
11.74
(76.92%)
📈 view plot
🚷 view threshold
17.33
(0.00%)Baseline: 17.33
22.53
(76.92%)
📈 view plot
🚷 view threshold
106.14
(0.00%)Baseline: 106.14
137.98
(76.92%)
📈 view plot
🚷 view threshold
749.15
(0.00%)Baseline: 749.15
524.40
(70.00%)
/posts_page: Pro📈 view plot
🚷 view threshold
100.00
(0.00%)Baseline: 100.00
130.00
(76.92%)
📈 view plot
🚷 view threshold
8.07
(0.00%)Baseline: 8.07
10.49
(76.92%)
📈 view plot
🚷 view threshold
11.74
(0.00%)Baseline: 11.74
15.26
(76.92%)
📈 view plot
🚷 view threshold
85.74
(0.00%)Baseline: 85.74
111.46
(76.92%)
📈 view plot
🚷 view threshold
972.74
(0.00%)Baseline: 972.74
680.92
(70.00%)
/pure_component: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
335.83
(0.00%)Baseline: 335.83
436.58
(76.92%)
📈 view plot
🚷 view threshold
520.29
(0.00%)Baseline: 520.29
676.38
(76.92%)
📈 view plot
🚷 view threshold
3,811.18
(0.00%)Baseline: 3,811.18
4,954.53
(76.92%)
📈 view plot
🚷 view threshold
17.85
(0.00%)Baseline: 17.85
12.49
(70.00%)
/pure_component: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.16
(0.00%)Baseline: 17.16
22.31
(76.92%)
📈 view plot
🚷 view threshold
26.61
(0.00%)Baseline: 26.61
34.59
(76.92%)
📈 view plot
🚷 view threshold
180.37
(0.00%)Baseline: 180.37
234.48
(76.92%)
📈 view plot
🚷 view threshold
443.33
(0.00%)Baseline: 443.33
310.33
(70.00%)
/pure_component_wrapped_in_function: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
9.22
(0.00%)Baseline: 9.22
11.99
(76.92%)
📈 view plot
🚷 view threshold
18.49
(0.00%)Baseline: 18.49
24.04
(76.92%)
📈 view plot
🚷 view threshold
111.52
(0.00%)Baseline: 111.52
144.98
(76.92%)
📈 view plot
🚷 view threshold
737.50
(0.00%)Baseline: 737.50
516.25
(70.00%)
/pure_component_wrapped_in_function: Pro📈 view plot
🚷 view threshold
100.00
(0.00%)Baseline: 100.00
130.00
(76.92%)
📈 view plot
🚷 view threshold
15.90
(0.00%)Baseline: 15.90
20.67
(76.92%)
📈 view plot
🚷 view threshold
25.53
(0.00%)Baseline: 25.53
33.19
(76.92%)
📈 view plot
🚷 view threshold
174.92
(0.00%)Baseline: 174.92
227.40
(76.92%)
📈 view plot
🚷 view threshold
371.58
(0.00%)Baseline: 371.58
260.11
(70.00%)
/react_helmet: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
398.05
(0.00%)Baseline: 398.05
517.47
(76.92%)
📈 view plot
🚷 view threshold
444.82
(0.00%)Baseline: 444.82
578.27
(76.92%)
📈 view plot
🚷 view threshold
3,732.90
(0.00%)Baseline: 3,732.90
4,852.77
(76.92%)
📈 view plot
🚷 view threshold
22.98
(0.00%)Baseline: 22.98
16.09
(70.00%)
/react_helmet: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
18.76
(0.00%)Baseline: 18.76
24.39
(76.92%)
📈 view plot
🚷 view threshold
29.86
(0.00%)Baseline: 29.86
38.82
(76.92%)
📈 view plot
🚷 view threshold
216.96
(0.00%)Baseline: 216.96
282.05
(76.92%)
📈 view plot
🚷 view threshold
417.58
(0.00%)Baseline: 417.58
292.31
(70.00%)
/react_helmet_broken: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
362.01
(0.00%)Baseline: 362.01
470.61
(76.92%)
📈 view plot
🚷 view threshold
446.89
(0.00%)Baseline: 446.89
580.96
(76.92%)
📈 view plot
🚷 view threshold
4,007.91
(0.00%)Baseline: 4,007.91
5,210.28
(76.92%)
📈 view plot
🚷 view threshold
22.59
(0.00%)Baseline: 22.59
15.81
(70.00%)
/react_helmet_broken: Pro📈 view plot
🚷 view threshold
100.00
(0.00%)Baseline: 100.00
130.00
(76.92%)
📈 view plot
🚷 view threshold
18.35
(0.00%)Baseline: 18.35
23.86
(76.92%)
📈 view plot
🚷 view threshold
27.24
(0.00%)Baseline: 27.24
35.41
(76.92%)
📈 view plot
🚷 view threshold
200.89
(0.00%)Baseline: 200.89
261.16
(76.92%)
📈 view plot
🚷 view threshold
419.52
(0.00%)Baseline: 419.52
293.66
(70.00%)
/react_router: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
370.50
(0.00%)Baseline: 370.50
481.65
(76.92%)
📈 view plot
🚷 view threshold
462.37
(0.00%)Baseline: 462.37
601.08
(76.92%)
📈 view plot
🚷 view threshold
4,389.00
(0.00%)Baseline: 4,389.00
5,705.70
(76.92%)
📈 view plot
🚷 view threshold
21.99
(0.00%)Baseline: 21.99
15.39
(70.00%)
/react_router: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
15.36
(0.00%)Baseline: 15.36
19.97
(76.92%)
📈 view plot
🚷 view threshold
20.44
(0.00%)Baseline: 20.44
26.57
(76.92%)
📈 view plot
🚷 view threshold
379.89
(0.00%)Baseline: 379.89
493.86
(76.92%)
📈 view plot
🚷 view threshold
323.68
(0.00%)Baseline: 323.68
226.58
(70.00%)
/redis_receiver: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
78.82
(0.00%)Baseline: 78.82
102.47
(76.92%)
📈 view plot
🚷 view threshold
125.63
(0.00%)Baseline: 125.63
163.32
(76.92%)
📈 view plot
🚷 view threshold
542.41
(0.00%)Baseline: 542.41
705.13
(76.92%)
📈 view plot
🚷 view threshold
105.47
(0.00%)Baseline: 105.47
73.83
(70.00%)
/render_js: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
329.64
(0.00%)Baseline: 329.64
428.53
(76.92%)
📈 view plot
🚷 view threshold
410.49
(0.00%)Baseline: 410.49
533.64
(76.92%)
📈 view plot
🚷 view threshold
3,813.89
(0.00%)Baseline: 3,813.89
4,958.06
(76.92%)
📈 view plot
🚷 view threshold
24.66
(0.00%)Baseline: 24.66
17.26
(70.00%)
/render_js: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.45
(0.00%)Baseline: 17.45
22.68
(76.92%)
📈 view plot
🚷 view threshold
27.24
(0.00%)Baseline: 27.24
35.41
(76.92%)
📈 view plot
🚷 view threshold
187.81
(0.00%)Baseline: 187.81
244.15
(76.92%)
📈 view plot
🚷 view threshold
435.59
(0.00%)Baseline: 435.59
304.91
(70.00%)
/rendered_html: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
388.52
(0.00%)Baseline: 388.52
505.08
(76.92%)
📈 view plot
🚷 view threshold
439.18
(0.00%)Baseline: 439.18
570.93
(76.92%)
📈 view plot
🚷 view threshold
3,319.75
(0.00%)Baseline: 3,319.75
4,315.68
(76.92%)
📈 view plot
🚷 view threshold
23.37
(0.00%)Baseline: 23.37
16.36
(70.00%)
/rendered_html: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
20.69
(0.00%)Baseline: 20.69
26.90
(76.92%)
📈 view plot
🚷 view threshold
29.03
(0.00%)Baseline: 29.03
37.74
(76.92%)
📈 view plot
🚷 view threshold
113.26
(0.00%)Baseline: 113.26
147.24
(76.92%)
📈 view plot
🚷 view threshold
427.64
(0.00%)Baseline: 427.64
299.35
(70.00%)
🐰 View full continuous benchmarking report in Bencher

@github-actions
Copy link
Copy Markdown
Contributor

🐰 Bencher Report

Branchalexeyr/performance-tests
Testbedgithub-actions
Click to view all benchmark results
Benchmarkfailed_pctBenchmark Result
%
(Result Δ%)
Upper Boundary
%
(Limit %)
p50_latencyBenchmark Result
ms
(Result Δ%)
Upper Boundary
ms
(Limit %)
p90_latencyBenchmark Result
ms
(Result Δ%)
Upper Boundary
ms
(Limit %)
p99_latencyBenchmark Result
ms
(Result Δ%)
Upper Boundary
ms
(Limit %)
rpsBenchmark Result
req/s
(Result Δ%)
Lower Boundary
req/s
(Limit %)
/rsc_posts_page_over_http: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
19.30
(0.00%)Baseline: 19.30
25.09
(76.92%)
📈 view plot
🚷 view threshold
31.73
(0.00%)Baseline: 31.73
41.25
(76.92%)
📈 view plot
🚷 view threshold
154.58
(0.00%)Baseline: 154.58
200.95
(76.92%)
📈 view plot
🚷 view threshold
408.72
(0.00%)Baseline: 408.72
286.10
(70.00%)
/rsc_posts_page_over_redis: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
60.79
(0.00%)Baseline: 60.79
79.03
(76.92%)
📈 view plot
🚷 view threshold
93.54
(0.00%)Baseline: 93.54
121.60
(76.92%)
📈 view plot
🚷 view threshold
792.47
(0.00%)Baseline: 792.47
1,030.21
(76.92%)
📈 view plot
🚷 view threshold
112.85
(0.00%)Baseline: 112.85
79.00
(70.00%)
/server_render_with_timeout: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
18.61
(0.00%)Baseline: 18.61
24.19
(76.92%)
📈 view plot
🚷 view threshold
22.89
(0.00%)Baseline: 22.89
29.76
(76.92%)
📈 view plot
🚷 view threshold
342.93
(0.00%)Baseline: 342.93
445.81
(76.92%)
📈 view plot
🚷 view threshold
310.05
(0.00%)Baseline: 310.05
217.04
(70.00%)
/server_router: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
21.70
(0.00%)Baseline: 21.70
28.21
(76.92%)
📈 view plot
🚷 view threshold
31.51
(0.00%)Baseline: 31.51
40.96
(76.92%)
📈 view plot
🚷 view threshold
124.99
(0.00%)Baseline: 124.99
162.49
(76.92%)
📈 view plot
🚷 view threshold
407.44
(0.00%)Baseline: 407.44
285.21
(70.00%)
/server_router_client_render: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
19.22
(0.00%)Baseline: 19.22
24.99
(76.92%)
📈 view plot
🚷 view threshold
26.69
(0.00%)Baseline: 26.69
34.70
(76.92%)
📈 view plot
🚷 view threshold
106.03
(0.00%)Baseline: 106.03
137.84
(76.92%)
📈 view plot
🚷 view threshold
462.50
(0.00%)Baseline: 462.50
323.75
(70.00%)
/server_side_hello_world: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
353.25
(0.00%)Baseline: 353.25
459.23
(76.92%)
📈 view plot
🚷 view threshold
442.39
(0.00%)Baseline: 442.39
575.11
(76.92%)
📈 view plot
🚷 view threshold
4,038.74
(0.00%)Baseline: 4,038.74
5,250.36
(76.92%)
📈 view plot
🚷 view threshold
23.23
(0.00%)Baseline: 23.23
16.26
(70.00%)
/server_side_hello_world: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
18.39
(0.00%)Baseline: 18.39
23.91
(76.92%)
📈 view plot
🚷 view threshold
29.46
(0.00%)Baseline: 29.46
38.30
(76.92%)
📈 view plot
🚷 view threshold
202.57
(0.00%)Baseline: 202.57
263.34
(76.92%)
📈 view plot
🚷 view threshold
424.97
(0.00%)Baseline: 424.97
297.48
(70.00%)
/server_side_hello_world_es5: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
348.05
(0.00%)Baseline: 348.05
452.46
(76.92%)
📈 view plot
🚷 view threshold
436.28
(0.00%)Baseline: 436.28
567.16
(76.92%)
📈 view plot
🚷 view threshold
3,835.34
(0.00%)Baseline: 3,835.34
4,985.94
(76.92%)
📈 view plot
🚷 view threshold
23.21
(0.00%)Baseline: 23.21
16.25
(70.00%)
/server_side_hello_world_es5: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
19.10
(0.00%)Baseline: 19.10
24.83
(76.92%)
📈 view plot
🚷 view threshold
28.54
(0.00%)Baseline: 28.54
37.10
(76.92%)
📈 view plot
🚷 view threshold
258.37
(0.00%)Baseline: 258.37
335.88
(76.92%)
📈 view plot
🚷 view threshold
408.33
(0.00%)Baseline: 408.33
285.83
(70.00%)
/server_side_hello_world_hooks: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
350.96
(0.00%)Baseline: 350.96
456.25
(76.92%)
📈 view plot
🚷 view threshold
446.32
(0.00%)Baseline: 446.32
580.22
(76.92%)
📈 view plot
🚷 view threshold
4,114.60
(0.00%)Baseline: 4,114.60
5,348.98
(76.92%)
📈 view plot
🚷 view threshold
23.12
(0.00%)Baseline: 23.12
16.18
(70.00%)
/server_side_hello_world_hooks: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
18.03
(0.00%)Baseline: 18.03
23.44
(76.92%)
📈 view plot
🚷 view threshold
27.28
(0.00%)Baseline: 27.28
35.46
(76.92%)
📈 view plot
🚷 view threshold
245.07
(0.00%)Baseline: 245.07
318.59
(76.92%)
📈 view plot
🚷 view threshold
429.92
(0.00%)Baseline: 429.92
300.94
(70.00%)
/server_side_hello_world_props: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
350.04
(0.00%)Baseline: 350.04
455.05
(76.92%)
📈 view plot
🚷 view threshold
434.12
(0.00%)Baseline: 434.12
564.36
(76.92%)
📈 view plot
🚷 view threshold
3,997.86
(0.00%)Baseline: 3,997.86
5,197.22
(76.92%)
📈 view plot
🚷 view threshold
23.19
(0.00%)Baseline: 23.19
16.23
(70.00%)
/server_side_hello_world_shared_store: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
713.29
(0.00%)Baseline: 713.29
927.28
(76.92%)
📈 view plot
🚷 view threshold
984.00
(0.00%)Baseline: 984.00
1,279.20
(76.92%)
📈 view plot
🚷 view threshold
8,193.55
(0.00%)Baseline: 8,193.55
10,651.61
(76.92%)
📈 view plot
🚷 view threshold
11.17
(0.00%)Baseline: 11.17
7.82
(70.00%)
/server_side_hello_world_shared_store: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
20.96
(0.00%)Baseline: 20.96
27.25
(76.92%)
📈 view plot
🚷 view threshold
30.99
(0.00%)Baseline: 30.99
40.29
(76.92%)
📈 view plot
🚷 view threshold
224.99
(0.00%)Baseline: 224.99
292.49
(76.92%)
📈 view plot
🚷 view threshold
374.51
(0.00%)Baseline: 374.51
262.16
(70.00%)
/server_side_hello_world_shared_store_controller: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
801.28
(0.00%)Baseline: 801.28
1,041.66
(76.92%)
📈 view plot
🚷 view threshold
990.52
(0.00%)Baseline: 990.52
1,287.68
(76.92%)
📈 view plot
🚷 view threshold
4,452.97
(0.00%)Baseline: 4,452.97
5,788.86
(76.92%)
📈 view plot
🚷 view threshold
11.24
(0.00%)Baseline: 11.24
7.87
(70.00%)
/server_side_hello_world_shared_store_controller: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.26
(0.00%)Baseline: 17.26
22.44
(76.92%)
📈 view plot
🚷 view threshold
28.27
(0.00%)Baseline: 28.27
36.75
(76.92%)
📈 view plot
🚷 view threshold
274.23
(0.00%)Baseline: 274.23
356.50
(76.92%)
📈 view plot
🚷 view threshold
375.78
(0.00%)Baseline: 375.78
263.05
(70.00%)
/server_side_hello_world_shared_store_defer: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
710.27
(0.00%)Baseline: 710.27
923.35
(76.92%)
📈 view plot
🚷 view threshold
967.07
(0.00%)Baseline: 967.07
1,257.19
(76.92%)
📈 view plot
🚷 view threshold
8,722.08
(0.00%)Baseline: 8,722.08
11,338.70
(76.92%)
📈 view plot
🚷 view threshold
11.17
(0.00%)Baseline: 11.17
7.82
(70.00%)
/server_side_hello_world_shared_store_defer: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
21.14
(0.00%)Baseline: 21.14
27.48
(76.92%)
📈 view plot
🚷 view threshold
31.65
(0.00%)Baseline: 31.65
41.15
(76.92%)
📈 view plot
🚷 view threshold
224.12
(0.00%)Baseline: 224.12
291.36
(76.92%)
📈 view plot
🚷 view threshold
371.51
(0.00%)Baseline: 371.51
260.06
(70.00%)
/server_side_hello_world_with_options: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
365.53
(0.00%)Baseline: 365.53
475.19
(76.92%)
📈 view plot
🚷 view threshold
446.51
(0.00%)Baseline: 446.51
580.46
(76.92%)
📈 view plot
🚷 view threshold
3,995.82
(0.00%)Baseline: 3,995.82
5,194.57
(76.92%)
📈 view plot
🚷 view threshold
23.12
(0.00%)Baseline: 23.12
16.18
(70.00%)
/server_side_hello_world_with_options: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
15.83
(0.00%)Baseline: 15.83
20.58
(76.92%)
📈 view plot
🚷 view threshold
22.30
(0.00%)Baseline: 22.30
28.99
(76.92%)
📈 view plot
🚷 view threshold
389.35
(0.00%)Baseline: 389.35
506.15
(76.92%)
📈 view plot
🚷 view threshold
305.33
(0.00%)Baseline: 305.33
213.73
(70.00%)
/server_side_log_throw: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
290.59
(0.00%)Baseline: 290.59
377.77
(76.92%)
📈 view plot
🚷 view threshold
437.03
(0.00%)Baseline: 437.03
568.14
(76.92%)
📈 view plot
🚷 view threshold
4,463.32
(0.00%)Baseline: 4,463.32
5,802.32
(76.92%)
📈 view plot
🚷 view threshold
22.80
(0.00%)Baseline: 22.80
15.96
(70.00%)
/server_side_log_throw: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
18.42
(0.00%)Baseline: 18.42
23.95
(76.92%)
📈 view plot
🚷 view threshold
27.61
(0.00%)Baseline: 27.61
35.89
(76.92%)
📈 view plot
🚷 view threshold
250.74
(0.00%)Baseline: 250.74
325.96
(76.92%)
📈 view plot
🚷 view threshold
425.06
(0.00%)Baseline: 425.06
297.54
(70.00%)
/server_side_log_throw_plain_js: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
358.71
(0.00%)Baseline: 358.71
466.32
(76.92%)
📈 view plot
🚷 view threshold
441.66
(0.00%)Baseline: 441.66
574.16
(76.92%)
📈 view plot
🚷 view threshold
3,969.53
(0.00%)Baseline: 3,969.53
5,160.39
(76.92%)
📈 view plot
🚷 view threshold
23.11
(0.00%)Baseline: 23.11
16.18
(70.00%)
/server_side_log_throw_plain_js: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.09
(0.00%)Baseline: 17.09
22.22
(76.92%)
📈 view plot
🚷 view threshold
25.89
(0.00%)Baseline: 25.89
33.66
(76.92%)
📈 view plot
🚷 view threshold
187.59
(0.00%)Baseline: 187.59
243.87
(76.92%)
📈 view plot
🚷 view threshold
454.36
(0.00%)Baseline: 454.36
318.05
(70.00%)
/server_side_log_throw_raise: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
354.20
(0.00%)Baseline: 354.20
460.46
(76.92%)
📈 view plot
🚷 view threshold
439.12
(0.00%)Baseline: 439.12
570.86
(76.92%)
📈 view plot
🚷 view threshold
4,053.44
(0.00%)Baseline: 4,053.44
5,269.47
(76.92%)
📈 view plot
🚷 view threshold
23.10
(0.00%)Baseline: 23.10
16.17
(70.00%)
/server_side_log_throw_raise: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
9.68
(0.00%)Baseline: 9.68
12.58
(76.92%)
📈 view plot
🚷 view threshold
15.59
(0.00%)Baseline: 15.59
20.27
(76.92%)
📈 view plot
🚷 view threshold
137.29
(0.00%)Baseline: 137.29
178.48
(76.92%)
📈 view plot
🚷 view threshold
791.89
(0.00%)Baseline: 791.89
554.32
(70.00%)
/server_side_log_throw_raise_invoker: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
10.61
(0.00%)Baseline: 10.61
13.79
(76.92%)
📈 view plot
🚷 view threshold
17.86
(0.00%)Baseline: 17.86
23.22
(76.92%)
📈 view plot
🚷 view threshold
60.55
(0.00%)Baseline: 60.55
78.72
(76.92%)
📈 view plot
🚷 view threshold
789.21
(0.00%)Baseline: 789.21
552.45
(70.00%)
/server_side_log_throw_raise_invoker: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
6.23
(0.00%)Baseline: 6.23
8.10
(76.92%)
📈 view plot
🚷 view threshold
20.62
(0.00%)Baseline: 20.62
26.81
(76.92%)
📈 view plot
🚷 view threshold
357.36
(0.00%)Baseline: 357.36
464.57
(76.92%)
📈 view plot
🚷 view threshold
500.18
(0.00%)Baseline: 500.18
350.13
(70.00%)
/server_side_redux_app: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
364.61
(0.00%)Baseline: 364.61
473.99
(76.92%)
📈 view plot
🚷 view threshold
452.35
(0.00%)Baseline: 452.35
588.06
(76.92%)
📈 view plot
🚷 view threshold
4,385.45
(0.00%)Baseline: 4,385.45
5,701.09
(76.92%)
📈 view plot
🚷 view threshold
22.26
(0.00%)Baseline: 22.26
15.58
(70.00%)
/server_side_redux_app: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
21.77
(0.00%)Baseline: 21.77
28.30
(76.92%)
📈 view plot
🚷 view threshold
30.48
(0.00%)Baseline: 30.48
39.62
(76.92%)
📈 view plot
🚷 view threshold
118.80
(0.00%)Baseline: 118.80
154.44
(76.92%)
📈 view plot
🚷 view threshold
405.01
(0.00%)Baseline: 405.01
283.51
(70.00%)
/server_side_redux_app_cached: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
10.29
(0.00%)Baseline: 10.29
13.38
(76.92%)
📈 view plot
🚷 view threshold
17.31
(0.00%)Baseline: 17.31
22.50
(76.92%)
📈 view plot
🚷 view threshold
112.97
(0.00%)Baseline: 112.97
146.86
(76.92%)
📈 view plot
🚷 view threshold
712.19
(0.00%)Baseline: 712.19
498.53
(70.00%)
/server_side_redux_app_cached: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
17.53
(0.00%)Baseline: 17.53
22.79
(76.92%)
📈 view plot
🚷 view threshold
39.48
(0.00%)Baseline: 39.48
51.32
(76.92%)
📈 view plot
🚷 view threshold
183.53
(0.00%)Baseline: 183.53
238.59
(76.92%)
📈 view plot
🚷 view threshold
336.09
(0.00%)Baseline: 336.09
235.26
(70.00%)
/stream_async_components: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
18.85
(0.00%)Baseline: 18.85
24.51
(76.92%)
📈 view plot
🚷 view threshold
29.55
(0.00%)Baseline: 29.55
38.41
(76.92%)
📈 view plot
🚷 view threshold
196.37
(0.00%)Baseline: 196.37
255.28
(76.92%)
📈 view plot
🚷 view threshold
410.22
(0.00%)Baseline: 410.22
287.15
(70.00%)
/turbo_frame_tag_hello_world: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
8.95
(0.00%)Baseline: 8.95
11.63
(76.92%)
📈 view plot
🚷 view threshold
17.61
(0.00%)Baseline: 17.61
22.89
(76.92%)
📈 view plot
🚷 view threshold
104.81
(0.00%)Baseline: 104.81
136.25
(76.92%)
📈 view plot
🚷 view threshold
769.99
(0.00%)Baseline: 769.99
538.99
(70.00%)
/turbolinks_cache_disabled: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
7.71
(0.00%)Baseline: 7.71
10.02
(76.92%)
📈 view plot
🚷 view threshold
14.60
(0.00%)Baseline: 14.60
18.98
(76.92%)
📈 view plot
🚷 view threshold
190.59
(0.00%)Baseline: 190.59
247.77
(76.92%)
📈 view plot
🚷 view threshold
714.59
(0.00%)Baseline: 714.59
500.21
(70.00%)
/turbolinks_cache_disabled: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
18.78
(0.00%)Baseline: 18.78
24.41
(76.92%)
📈 view plot
🚷 view threshold
26.75
(0.00%)Baseline: 26.75
34.77
(76.92%)
📈 view plot
🚷 view threshold
102.92
(0.00%)Baseline: 102.92
133.80
(76.92%)
📈 view plot
🚷 view threshold
465.93
(0.00%)Baseline: 465.93
326.15
(70.00%)
/xhr_refresh: Core📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
672.82
(0.00%)Baseline: 672.82
874.67
(76.92%)
📈 view plot
🚷 view threshold
941.49
(0.00%)Baseline: 941.49
1,223.94
(76.92%)
📈 view plot
🚷 view threshold
7,914.11
(0.00%)Baseline: 7,914.11
10,288.34
(76.92%)
📈 view plot
🚷 view threshold
11.77
(0.00%)Baseline: 11.77
8.24
(70.00%)
/xhr_refresh: Pro📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
21.73
(0.00%)Baseline: 21.73
28.25
(76.92%)
📈 view plot
🚷 view threshold
33.79
(0.00%)Baseline: 33.79
43.93
(76.92%)
📈 view plot
🚷 view threshold
245.79
(0.00%)Baseline: 245.79
319.53
(76.92%)
📈 view plot
🚷 view threshold
365.66
(0.00%)Baseline: 365.66
255.96
(70.00%)
Pro Node Renderer: react_ssr (non-RSC)📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
5.00
(0.00%)Baseline: 5.00
6.50
(76.92%)
📈 view plot
🚷 view threshold
15.47
(0.00%)Baseline: 15.47
20.11
(76.92%)
📈 view plot
🚷 view threshold
21.34
(0.00%)Baseline: 21.34
27.74
(76.92%)
📈 view plot
🚷 view threshold
1,313.70
(0.00%)Baseline: 1,313.70
919.59
(70.00%)
Pro Node Renderer: simple_eval (non-RSC)📈 view plot
🚷 view threshold
0.00
(0.00%)Baseline: 0.00
0.00
(0.00%)
📈 view plot
🚷 view threshold
4.58
(0.00%)Baseline: 4.58
5.95
(76.92%)
📈 view plot
🚷 view threshold
14.98
(0.00%)Baseline: 14.98
19.47
(76.92%)
📈 view plot
🚷 view threshold
23.10
(0.00%)Baseline: 23.10
30.03
(76.92%)
📈 view plot
🚷 view threshold
1,373.53
(0.00%)Baseline: 1,373.53
961.47
(70.00%)
🐰 View full continuous benchmarking report in Bencher

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add performance tests

4 participants