name: Benchmarks
on:
workflow_dispatch:
inputs:
run_criterion:
description: "Run Criterion benches"
required: false
default: "true"
type: choice
options: ["true", "false"]
run_examples:
description: "Run benchmark comparison example"
required: false
default: "true"
type: choice
options: ["true", "false"]
run_bench_tests:
description: "Run bench-gated tests (cargo test --features bench-tests -- --ignored)"
required: false
default: "true"
type: choice
options: ["true", "false"]
schedule:
- cron: '0 5 * * *'
env:
CARGO_TERM_COLOR: always
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
jobs:
bench-tests:
if: ${{ github.event_name == 'schedule' || inputs.run_bench_tests == 'true' }}
name: Bench Tests (feature-flagged)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
- name: Cache
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: bench-tests-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Run bench-gated tests
run: cargo test --features bench-tests,meter -- --ignored
benchmark:
if: ${{ github.event_name == 'schedule' || inputs.run_criterion == 'true' || inputs.run_examples == 'true' }}
name: Performance Benchmarks
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: bench-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Prepare CPU governor (Linux only)
if: ${{ runner.os == 'Linux' }}
run: |
set -euxo pipefail
mkdir -p "$RUNNER_TEMP"
GOV_BAK="$RUNNER_TEMP/governors.bak"
: > "$GOV_BAK"
for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
if [ -f "$f" ]; then
echo "$f $(cat $f)" >> "$GOV_BAK"
echo performance | sudo tee "$f" >/dev/null || true
fi
done
echo "Saved governors to $GOV_BAK and set to performance where available."
- name: Run benchmark comparison
if: ${{ github.event_name == 'schedule' || inputs.run_examples == 'true' }}
run: cargo run --example benchmark_comparison --release --features meter
- name: Run criterion benchmarks (stabilized config)
if: ${{ github.event_name == 'schedule' || inputs.run_criterion == 'true' }}
run: >-
cargo bench --all-features --bench metrics_bench --
--warm-up-time 2.0 --measurement-time 3.0 --sample-size 50
- name: Regression gate (nightly, non-blocking temporarily)
if: ${{ github.event_name == 'schedule' }}
continue-on-error: true
run: CI_MODE=1 node tools/bench_regression_check.js
- name: Regression report (manual, non-blocking)
if: ${{ github.event_name != 'schedule' && inputs.run_criterion == 'true' }}
continue-on-error: true
run: node tools/bench_regression_check.js || echo "Non-blocking regression report only"
- name: Archive benchmark results
if: ${{ github.event_name == 'schedule' || inputs.run_criterion == 'true' }}
uses: actions/upload-artifact@v4
with:
name: benchmark-results-${{ matrix.os }}
path: target/criterion/
- name: Restore CPU governor (Linux only)
if: ${{ runner.os == 'Linux' }}
run: |
set -euxo pipefail
GOV_BAK="$RUNNER_TEMP/governors.bak"
if [ -f "$GOV_BAK" ]; then
while read -r path mode; do
if [ -n "$path" ] && [ -n "$mode" ] && [ -f "$path" ]; then
echo "$mode" | sudo tee "$path" >/dev/null || true
fi
done < "$GOV_BAK"
echo "Restored CPU governors from $GOV_BAK."
else
echo "No governor backup found; skipping restore."
fi
cross-platform-test:
name: Cross-Platform Compatibility
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
- os: macos-latest
target: x86_64-apple-darwin
- os: macos-latest
target: aarch64-apple-darwin
- os: windows-latest
target: x86_64-pc-windows-msvc
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Build for target
run: cargo build --target ${{ matrix.target }} --all-features
- name: Test cross-compilation
if: matrix.target == 'x86_64-unknown-linux-gnu' || matrix.target == 'x86_64-apple-darwin' || matrix.target == 'x86_64-pc-windows-msvc'
run: cargo test --target ${{ matrix.target }}
memory-profile:
name: Memory Profiling
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install valgrind
run: sudo apt-get update && sudo apt-get install -y valgrind
- name: Run memory tests
run: |
cargo build --example benchmark_comparison --features meter
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all \
./target/debug/examples/benchmark_comparison || true