From 967bcd6677ad506084ec2de14a4622bb79eaee9b Mon Sep 17 00:00:00 2001 From: kunxian xia Date: Wed, 17 Jun 2026 19:28:39 +0800 Subject: [PATCH 1/3] ci: add sumcheck performance regression guard --- .github/scripts/check-criterion-regression.sh | 59 +++++++++++++++++ .github/workflows/perf-regression.yml | 64 +++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100755 .github/scripts/check-criterion-regression.sh create mode 100644 .github/workflows/perf-regression.yml diff --git a/.github/scripts/check-criterion-regression.sh b/.github/scripts/check-criterion-regression.sh new file mode 100755 index 0000000..7360568 --- /dev/null +++ b/.github/scripts/check-criterion-regression.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +base_sha="${1:?base sha is required}" +head_sha="${2:?head sha is required}" + +bench="${GKR_PERF_BENCH:-ceno_batched_main}" +baseline="${GKR_PERF_BASELINE:-ci-main}" +noise_threshold="${GKR_PERF_NOISE_THRESHOLD:-0.15}" +output_file="${RUNNER_TEMP:-/tmp}/criterion-${bench}-comparison.log" + +export RUST_MIN_STACK="${RUST_MIN_STACK:-33554432}" +export GKR_CENO_BENCH_SCALE="${GKR_CENO_BENCH_SCALE:-tiny}" +export GKR_CENO_BENCH_SAMPLES="${GKR_CENO_BENCH_SAMPLES:-10}" + +fetch_commit() { + local remote_url="$1" + local sha="$2" + + if git rev-parse --verify --quiet "${sha}^{commit}" >/dev/null; then + return + fi + + git fetch --no-tags --depth=1 "$remote_url" "$sha" +} + +if [[ -n "${BASE_REPO_URL:-}" ]]; then + fetch_commit "$BASE_REPO_URL" "$base_sha" +fi + +if [[ -n "${HEAD_REPO_URL:-}" ]]; then + fetch_commit "$HEAD_REPO_URL" "$head_sha" +fi + +git checkout --detach "$base_sha" +cargo bench -p sumcheck --bench "$bench" -- --save-baseline "$baseline" + +git checkout --detach "$head_sha" +cargo bench -p sumcheck --bench "$bench" -- \ + --baseline "$baseline" \ + --noise-threshold "$noise_threshold" \ + | tee "$output_file" + +if grep -q "Performance has regressed" "$output_file"; then + echo "::error::Criterion reported a sumcheck performance regression." + awk ' + /^Benchmarking / { benchmark = $0 } + /^[[:space:]]*change:/ { change = $0 } + /Performance has regressed/ { + print benchmark + print change + print $0 + print "" + } + ' "$output_file" + exit 1 +fi + +echo "No Criterion performance regression detected for ${bench}." diff --git a/.github/workflows/perf-regression.yml b/.github/workflows/perf-regression.yml new file mode 100644 index 0000000..49b8012 --- /dev/null +++ b/.github/workflows/perf-regression.yml @@ -0,0 +1,64 @@ +name: Performance Regression + +on: + pull_request: + types: [synchronize, opened, reopened, ready_for_review] + paths: + - ".github/scripts/check-criterion-regression.sh" + - ".github/workflows/perf-regression.yml" + - "Cargo.lock" + - "Cargo.toml" + - "crates/ff_ext/**" + - "crates/multilinear_extensions/**" + - "crates/p3/**" + - "crates/sumcheck/**" + - "crates/transcript/**" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + sumcheck: + name: Sumcheck Criterion Guard + timeout-minutes: 30 + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - uses: dtolnay/rust-toolchain@master + with: + toolchain: nightly-2025-08-18 + + - name: Cargo cache + uses: actions/cache@v4 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: perf-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: perf-${{ runner.os }}-cargo- + + - name: Check sumcheck performance regression + env: + BASE_REPO_URL: https://x-access-token:${{ github.token }}@github.com/${{ github.event.pull_request.base.repo.full_name }}.git + HEAD_REPO_URL: https://x-access-token:${{ github.token }}@github.com/${{ github.event.pull_request.head.repo.full_name }}.git + CARGO_INCREMENTAL: "0" + GKR_CENO_BENCH_SAMPLES: "10" + GKR_CENO_BENCH_SCALE: tiny + GKR_PERF_NOISE_THRESHOLD: "0.15" + RAYON_NUM_THREADS: "2" + RUST_MIN_STACK: "33554432" + run: | + bash .github/scripts/check-criterion-regression.sh \ + "${{ github.event.pull_request.base.sha }}" \ + "${{ github.event.pull_request.head.sha }}" From 16f547f39e526e07366ac6877fa751b3aafe3475 Mon Sep 17 00:00:00 2001 From: kunxian xia Date: Wed, 17 Jun 2026 19:31:07 +0800 Subject: [PATCH 2/3] ci: limit perf guard to main PRs --- .github/workflows/perf-regression.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/perf-regression.yml b/.github/workflows/perf-regression.yml index 49b8012..4084662 100644 --- a/.github/workflows/perf-regression.yml +++ b/.github/workflows/perf-regression.yml @@ -2,6 +2,8 @@ name: Performance Regression on: pull_request: + branches: + - main types: [synchronize, opened, reopened, ready_for_review] paths: - ".github/scripts/check-criterion-regression.sh" From 3f78c1b23ccec00490afd4ae819b24c1d1c295c5 Mon Sep 17 00:00:00 2001 From: kunxian xia Date: Wed, 17 Jun 2026 19:33:42 +0800 Subject: [PATCH 3/3] ci: run perf guard on all main PRs --- .github/workflows/perf-regression.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/perf-regression.yml b/.github/workflows/perf-regression.yml index 4084662..2d1a8b1 100644 --- a/.github/workflows/perf-regression.yml +++ b/.github/workflows/perf-regression.yml @@ -5,16 +5,6 @@ on: branches: - main types: [synchronize, opened, reopened, ready_for_review] - paths: - - ".github/scripts/check-criterion-regression.sh" - - ".github/workflows/perf-regression.yml" - - "Cargo.lock" - - "Cargo.toml" - - "crates/ff_ext/**" - - "crates/multilinear_extensions/**" - - "crates/p3/**" - - "crates/sumcheck/**" - - "crates/transcript/**" concurrency: group: ${{ github.workflow }}-${{ github.ref || github.run_id }}