mirror of
https://github.com/danbulant/oxc
synced 2026-05-25 04:42:10 +00:00
Add NodeJS parser to benchmarks. Previous attempt #2724 did not work due CodSpeed producing very inaccurate results (https://github.com/CodSpeedHQ/action/issues/96). This version runs the actual benchmarks without CodSpeed's instrumentation. Then another faux-benchmark runs within Codspeed's instrumented action and just performs meaningless calculations in a loop for as long as is required to take same amount of time as the original uninstrumented benchmarks took. It's unfortunate that we therefore don't get flame graphs on CodSpeed, but this seems to be the best we can do for now.
166 lines
5.1 KiB
YAML
166 lines
5.1 KiB
YAML
name: Benchmark
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
pull_request:
|
|
types: [opened, synchronize]
|
|
paths:
|
|
- '**/*.rs'
|
|
- 'napi/parser/**/*.js'
|
|
- 'napi/parser/**/*.mjs'
|
|
- 'Cargo.lock'
|
|
- '.github/workflows/benchmark.yml'
|
|
- 'tasks/benchmark/codspeed/*.mjs'
|
|
push:
|
|
branches:
|
|
- main
|
|
- bench-*
|
|
paths:
|
|
- '**/*.rs'
|
|
- 'napi/parser/**/*.js'
|
|
- 'napi/parser/**/*.mjs'
|
|
- 'Cargo.lock'
|
|
- '.github/workflows/benchmark.yml'
|
|
- 'tasks/benchmark/codspeed/*.mjs'
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
benchmark:
|
|
name: Benchmark
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
# Run each benchmark in own job.
|
|
# Linter benchmark is by far the slowest, so split each fixture into own job.
|
|
component: [lexer, parser, transformer, semantic, minifier, codegen_sourcemap, parser_napi]
|
|
include:
|
|
- component: linter
|
|
fixture: 0
|
|
- component: linter
|
|
fixture: 1
|
|
- component: linter
|
|
fixture: 2
|
|
- component: linter
|
|
fixture: 3
|
|
- component: linter
|
|
fixture: 4
|
|
steps:
|
|
- name: Checkout Branch
|
|
uses: actions/checkout@v4
|
|
with:
|
|
show-progress: false
|
|
persist-credentials: false
|
|
|
|
- name: Install Rust Toolchain
|
|
uses: ./.github/actions/rustup
|
|
with:
|
|
shared-key: ${{ matrix.component == 'parser_napi' && 'benchmark_napi' || 'benchmark' }}
|
|
save-cache: ${{ github.ref_name == 'main' }}
|
|
|
|
- name: Install codspeed
|
|
uses: taiki-e/install-action@v2
|
|
with:
|
|
tool: cargo-codspeed
|
|
|
|
- name: Install Node.js
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 20
|
|
registry-url: 'https://registry.npmjs.org'
|
|
|
|
- name: Start bench results interceptor server
|
|
working-directory: ./tasks/benchmark/codspeed
|
|
env:
|
|
COMPONENT: ${{ matrix.component }}
|
|
FIXTURE: ${{ matrix.fixture }}
|
|
run: |
|
|
corepack enable
|
|
pnpm install
|
|
node capture.mjs &
|
|
|
|
# CodSpeed gets measurements completely off for NAPI if run in `CodSpeedHQ/action`,
|
|
# so instead run real benchmark without CodSpeed's instrumentation and save the results.
|
|
# Then "Run benchmark" step below runs a loop of some simple Rust code the number
|
|
# of times required to take same amount of time as the real benchmark took.
|
|
# This is all a workaround for https://github.com/CodSpeedHQ/action/issues/96
|
|
- name: Build NAPI Benchmark
|
|
if: ${{ matrix.component == 'parser_napi'}}
|
|
working-directory: ./napi/parser
|
|
run: |
|
|
corepack enable
|
|
pnpm install
|
|
pnpm build
|
|
|
|
- name: Run NAPI Benchmark
|
|
if: ${{ matrix.component == 'parser_napi'}}
|
|
working-directory: ./napi/parser
|
|
run: node parse.bench.mjs
|
|
|
|
- name: Build benchmark
|
|
env:
|
|
RUSTFLAGS: "-C debuginfo=2 -C strip=none -g --cfg codspeed"
|
|
shell: bash
|
|
run: |
|
|
cargo build --release -p oxc_benchmark --bench ${{ matrix.component }} \
|
|
--features ${{ matrix.component == 'parser_napi' && 'codspeed_napi' || 'codspeed'}}
|
|
mkdir -p target/codspeed/oxc_benchmark/
|
|
mv target/release/deps/${{ matrix.component }}-* target/codspeed/oxc_benchmark
|
|
rm -rf target/codspeed/oxc_benchmark/*.d
|
|
|
|
- name: Run benchmark
|
|
uses: CodSpeedHQ/action@v2
|
|
timeout-minutes: 30
|
|
env:
|
|
FIXTURE: ${{ matrix.fixture }}
|
|
with:
|
|
run: cargo codspeed run
|
|
# Dummy token for tokenless runs, to suppress logging hash of metadata JSON (see `upload.mjs`)
|
|
token: ${{ secrets.CODSPEED_TOKEN || 'dummy' }}
|
|
upload-url: http://localhost:${{ env.INTERCEPT_PORT }}/upload
|
|
|
|
- name: Upload bench data artefact
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ matrix.component }}${{ matrix.fixture }}
|
|
path: ${{ env.DATA_DIR }}
|
|
if-no-files-found: error
|
|
retention-days: 1
|
|
|
|
upload:
|
|
name: Upload benchmarks
|
|
needs: benchmark
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout Branch
|
|
uses: actions/checkout@v4
|
|
with:
|
|
show-progress: false
|
|
persist-credentials: false
|
|
|
|
- name: Install Node.js
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 20
|
|
registry-url: 'https://registry.npmjs.org'
|
|
|
|
- name: Create temp dir
|
|
working-directory: ./tasks/benchmark/codspeed
|
|
run: |
|
|
corepack enable
|
|
pnpm install
|
|
node create_temp_dir.mjs
|
|
|
|
- name: Download artefacts
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
path: ${{ env.DATA_DIR }}
|
|
merge-multiple: true
|
|
|
|
- name: Upload to Codspeed
|
|
working-directory: ./tasks/benchmark/codspeed
|
|
env:
|
|
CODSPEED_TOKEN: ${{ secrets.CODSPEED_TOKEN }}
|
|
run: node upload.mjs
|