# Runs benchmarks.

on:
  pull_request:
  merge_group:
  push:
    branches: [main]

env:
  CARGO_TERM_COLOR: always
  BASELINE: base
  IAI_CALLGRIND_RUNNER: iai-callgrind-runner

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

name: bench
jobs:
  iai:
    runs-on:
      group: Reth
    # Only run benchmarks in merge groups and on main
    if: github.event_name != 'pull_request'
    steps:
      - uses: actions/checkout@v4
      - name: Install Valgrind
        run: sudo apt update && sudo apt install valgrind
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true
      - name: Install cargo-binstall
        uses: taiki-e/install-action@cargo-binstall
      - name: Install iai-callgrind-runner
        run: |
          echo "::group::Install"
          version=$(cargo metadata --format-version=1 |\
            jq '.packages[] | select(.name == "iai-callgrind").version' |\
            tr -d '"'
          )
          cargo binstall iai-callgrind-runner --version $version --no-confirm --no-symlinks --force
          echo "::endgroup::"
          echo "::group::Verification"
          which iai-callgrind-runner
          echo "::endgroup::"
      - name: Checkout base
        uses: actions/checkout@v4
        with:
          ref: ${{ github.base_ref || 'main' }}
      - name: Generate test vectors
        run: cargo run --bin reth --features dev -- test-vectors tables
      - name: Save baseline
        run: cargo bench -p reth-db --bench iai --profile profiling --features test-utils -- --save-baseline=$BASELINE
      - name: Checkout PR
        uses: actions/checkout@v4
        with:
          clean: false
      - name: Compare PR benchmarks
        run: cargo bench -p reth-db --bench iai --profile profiling --features test-utils -- --baseline=$BASELINE
