Skip to content

feat(evm): enable basic performance check in ci #1015

feat(evm): enable basic performance check in ci

feat(evm): enable basic performance check in ci #1015

name: DTVM-EVM test CI in x86-64
on:
push:
paths-ignore:
- 'docs/**'
- 'resources/**'
- '*.md'
- '.gitignore'
pull_request:
paths-ignore:
- 'docs/**'
- 'resources/**'
- '*.md'
- '.gitignore'
permissions:
contents: read
jobs:
build_test_evm_interpreter_x86_ctest:
name: Test DTVM-EVM interpreter with ctest on x86-64
runs-on: ubuntu-latest
container:
image: dtvmdev1/dtvm-dev-x64:main
steps:
- name: Check out code
uses: actions/checkout@v3
with:
submodules: "true"
- name: Code Format Check
run: |
./tools/format.sh check
- name: Clone asmjit
run: |
git clone https://github.com/asmjit/asmjit.git
- name: Build and Test
run: |
echo "current home is $HOME"
export LLVM_SYS_150_PREFIX=/opt/llvm15
export LLVM_DIR=$LLVM_SYS_150_PREFIX/lib/cmake/llvm
export PATH=$LLVM_SYS_150_PREFIX/bin:$PATH
export CMAKE_BUILD_TARGET=Debug
export ENABLE_ASAN=true
export RUN_MODE=interpreter
export INPUT_FORMAT=evm
export ENABLE_LAZY=true
export ENABLE_MULTITHREAD=true
export TestSuite=evmtestsuite
export CPU_EXCEPTION_TYPE='check'
export ENABLE_GAS_METER=false
bash .ci/run_test_suite.sh
build_test_release_multipass_lazy_evmtestsuite_on_x86_ctest:
name: Test DTVM-EVM multipass in release mode with ctest on x86-64
runs-on: ubuntu-latest
container:
image: dtvmdev1/dtvm-dev-x64:main
steps:
- name: Check out code
uses: actions/checkout@v3
with:
submodules: "true"
- name: Code Format Check
run: |
./tools/format.sh check
- name: Build and Test
run: |
echo "current home is $HOME"
export LLVM_SYS_150_PREFIX=/opt/llvm15
export LLVM_DIR=$LLVM_SYS_150_PREFIX/lib/cmake/llvm
export PATH=$LLVM_SYS_150_PREFIX/bin:$PATH
export CMAKE_BUILD_TARGET=Release
export ENABLE_ASAN=true
export RUN_MODE=multipass
export INPUT_FORMAT=evm
export ENABLE_LAZY=false
export ENABLE_MULTITHREAD=true
export TestSuite=evmtestsuite
export CPU_EXCEPTION_TYPE='check'
export ENABLE_GAS_METER=true
bash .ci/run_test_suite.sh
build_test_evm_interpreter_x86_cli:
name: Test DTVM-EVM interpreter with CLI on x86-64
runs-on: ubuntu-latest
container:
image: dtvmdev1/dtvm-dev-x64:main
steps:
- name: Check out code
uses: actions/checkout@v3
with:
submodules: "true"
- name: Code Format Check
run: |
./tools/format.sh check
- name: Build and Test
run: |
echo "current home is $HOME"
export LLVM_SYS_150_PREFIX=/opt/llvm15
export LLVM_DIR=$LLVM_SYS_150_PREFIX/lib/cmake/llvm
export PATH=$LLVM_SYS_150_PREFIX/bin:$PATH
export CMAKE_BUILD_TARGET=Debug
export ENABLE_ASAN=true
export RUN_MODE=interpreter
export INPUT_FORMAT=evm
export ENABLE_LAZY=true
export ENABLE_MULTITHREAD=true
export TestSuite=evmrealsuite
export CPU_EXCEPTION_TYPE='check'
export ENABLE_GAS_METER=false
bash .ci/run_test_suite.sh
build_test_debug_multipass_lazy_evmtestsuite_on_x86:
name: Test DTVM-EVM multipass in debug mode on x86-64
runs-on: ubuntu-latest
container:
image: dtvmdev1/dtvm-dev-x64:main
steps:
- name: Check out code
uses: actions/checkout@v3
with:
submodules: "true"
- name: Code Format Check
run: |
./tools/format.sh check
- name: Build and Test
run: |
echo "current home is $HOME"
export LLVM_SYS_150_PREFIX=/opt/llvm15
export LLVM_DIR=$LLVM_SYS_150_PREFIX/lib/cmake/llvm
export PATH=$LLVM_SYS_150_PREFIX/bin:$PATH
export CMAKE_BUILD_TARGET=Debug
export ENABLE_ASAN=true
export RUN_MODE=multipass
export INPUT_FORMAT=evm
export ENABLE_LAZY=false
export ENABLE_MULTITHREAD=true
export TestSuite=evmrealsuite
export CPU_EXCEPTION_TYPE='check'
export ENABLE_GAS_METER=true
bash .ci/run_test_suite.sh
build_test_release_evmone_unittests_on_x86:
name: Test DTVM-EVM multipass and interpreter using evmone unit tests in release mode on x86-64
runs-on: ubuntu-latest
container:
image: dtvmdev1/dtvm-dev-x64:main
steps:
- name: Check out code
uses: actions/checkout@v3
with:
submodules: "true"
- name: Code Format Check
run: |
./tools/format.sh check
- name: Build and Test
run: |
echo "current home is $HOME"
export LLVM_SYS_150_PREFIX=/opt/llvm15
export LLVM_DIR=$LLVM_SYS_150_PREFIX/lib/cmake/llvm
export PATH=$LLVM_SYS_150_PREFIX/bin:$PATH
export CMAKE_BUILD_TARGET=Release
export ENABLE_ASAN=true
export RUN_MODE=multipass
export CPU_EXCEPTION_TYPE='cpu'
export TestSuite=evmonetestsuite
bash .ci/run_test_suite.sh
performance_regression_check:
name: Performance Regression Check (10% threshold)
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
container:
image: dtvmdev1/dtvm-dev-x64:main
steps:
- name: Check out code
uses: actions/checkout@v3
with:
submodules: "true"
fetch-depth: 0
- name: Setup git safe directory
run: |
echo "Configuring git safe directory: ${{ github.workspace }}"
git config --global --add safe.directory /__w/DTVM/DTVM
- name: Code Format Check
run: |
./tools/format.sh check
- name: Build baseline (${{ github.base_ref }})
run: |
echo "Building baseline on branch: ${{ github.base_ref }}"
export LLVM_SYS_150_PREFIX=/opt/llvm15
export LLVM_DIR=$LLVM_SYS_150_PREFIX/lib/cmake/llvm
export PATH=$LLVM_SYS_150_PREFIX/bin:$PATH
# Save current state (including untracked files)
git stash push -u -m "perf-check-stash"
git checkout ${{ github.base_ref }}
# Build baseline
export CMAKE_BUILD_TARGET=Release
export ENABLE_ASAN=false
export RUN_MODE=multipass
export ENABLE_LAZY=false
export ENABLE_MULTITHREAD=true
export TestSuite=benchmarksuite
export CPU_EXCEPTION_TYPE='cpu'
export BENCHMARK_MODE=multipass
export BENCHMARK_SAVE_BASELINE=/tmp/perf_baseline.json
bash .ci/run_test_suite.sh
- name: Build current PR and check regression
id: perf-check
run: |
echo "Building PR branch: ${{ github.sha }}"
export LLVM_SYS_150_PREFIX=/opt/llvm15
export LLVM_DIR=$LLVM_SYS_150_PREFIX/lib/cmake/llvm
export PATH=$LLVM_SYS_150_PREFIX/bin:$PATH
# Switch back to PR branch
git checkout ${{ github.sha }}
git stash pop || true
# Clean and rebuild for current PR
rm -rf build evmone
# Build and check
export CMAKE_BUILD_TARGET=Release
export ENABLE_ASAN=false
export RUN_MODE=multipass
export ENABLE_LAZY=false
export ENABLE_MULTITHREAD=true
export TestSuite=benchmarksuite
export CPU_EXCEPTION_TYPE='cpu'
export BENCHMARK_MODE=multipass
export BENCHMARK_THRESHOLD=0.10
export BENCHMARK_BASELINE_FILE=/tmp/perf_baseline.json
export BENCHMARK_SUMMARY_FILE=/tmp/perf_summary.md
bash .ci/run_test_suite.sh
continue-on-error: true
- name: Comment on PR
if: always()
uses: actions/github-script@v6
with:
script: |
const fs = require('fs');
const passed = '${{ steps.perf-check.outcome }}' === 'success';
let summary = '';
try {
summary = fs.readFileSync('/tmp/perf_summary.md', 'utf8');
} catch (e) {
summary = '_No benchmark summary available._';
}
const icon = passed ? '✅' : '⚠️';
const title = passed
? 'Performance Check Passed'
: 'Performance Regression Detected';
const body = `${icon} **${title}**\n\n${summary}`;
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: body
});
- name: Fail on regression
if: steps.perf-check.outcome == 'failure'
run: |
echo "::error::Performance regression detected. See logs for details."
exit 1