Skip to content

bench

bench #622

Workflow file for this run

name: bench
permissions:
contents: write
on:
# push:
# branches:
# - main
workflow_dispatch:
inputs:
index:
description: 'Benchmark index'
required: false
default: 'default'
selector:
description: 'Benchmark selector'
required: false
default: 'Kyo'
warmupIterations:
description: 'Warmup iterations'
required: false
default: '10'
measurementIterations:
description: 'Measurement iterations'
required: false
default: '4'
iterationTime:
description: 'Iteration time'
required: false
default: '1'
forks:
description: 'Number of forks'
required: false
default: '1'
threads:
description: 'Number of threads'
required: false
default: '1'
profileEvents:
description: 'Profile events'
required: false
default: 'alloc,cpu'
jobs:
bench:
name: bench
runs-on: bench
timeout-minutes: 240
env:
IX: ${{ github.event.inputs.index || 'default' }}
SE: ${{ github.event.inputs.selector || 'Kyo' }}
WI: ${{ github.event.inputs.warmupIterations || '13' }}
MI: ${{ github.event.inputs.measurementIterations || '5' }}
IT: ${{ github.event.inputs.iterationTime || '1' }}
FK: ${{ github.event.inputs.forks || '1' }}
TH: ${{ github.event.inputs.threads || '1' }}
PE: ${{ github.event.inputs.profileEvents || 'alloc,cpu' }}
steps:
- uses: actions/checkout@v3.0.2
with:
fetch-depth: 0
- uses: olafurpg/setup-scala@v13
with:
java-version: openjdk@21.0.2=tgz+https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz
- name: install async-profiler
run: |
cd /home/runner
wget https://github.com/jvm-profiling-tools/async-profiler/releases/download/v2.9/async-profiler-2.9-linux-x64.tar.gz
tar -xvzf async-profiler-2.9-linux-x64.tar.gz
sudo mkdir -p /usr/java/packages/lib/
sudo cp async-profiler-2.9-linux-x64/build/libasyncProfiler.so /usr/java/packages/lib/
sudo sysctl kernel.perf_event_paranoid=1
sudo sysctl kernel.kptr_restrict=0
- name: run
run: |
IFS=', ' read -r -a array <<< "$PE"
for EVENT in "${array[@]}"
do
ESCAPED_EVENT=$(printf '%q' "$EVENT")
sbt "kyo-bench/jmh:clean;kyo-bench/jmh:run -wi $WI -i $MI -r $IT -w $IT -f $FK -t $TH -foe true -prof \"async:event=$ESCAPED_EVENT;output=flamegraph\" $SE"
done
sbt "kyo-bench/jmh:clean;kyo-bench/jmh:run -wi $WI -i $MI -r $IT -w $IT -f $FK -t $TH -foe true -prof gc -rf json $SE"
- name: prepare results
run: |
short_sha=$(echo "${{ github.sha }}" | cut -c 1-7)
mkdir -p output/
cp -r kyo-bench/.jvm/jmh-result.json output/#${short_sha}-jmh-result.json
cp -r kyo-bench/.jvm/kyo.bench.* output/
rm -rf output/**/*reverse.html
for file in $(find output -name "*.html"); do
newfile=$(echo $file | sed 's/\([^.]*\)-.*flame-\([^-]*\)-forward.html/\1-\2.html/')
if [ "$file" != "$newfile" ]; then
mv "$file" "$newfile"
fi
done
for file in $(find output -name "*.html"); do
new_name="${short_sha}-$(basename "$file")"
mv "$file" "$(dirname "$file")/$new_name"
done
ls output/
- name: publish results
id: publish-results
uses: actions/github-script@v5
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const fs = require('fs').promises;
const path = require('path');
const short_sha = context.sha.substring(0, 7);
const tag = `bench-${short_sha}`;
const date = new Date().toISOString().split('T')[0];
const release = await github.rest.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: tag,
name: `Benchmark Results ${short_sha} ${date}`,
body: `Benchmark results for commit ${context.sha} on ${date}`,
prerelease: true
});
async function* getFiles(dir) {
const entries = await fs.readdir(dir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
if (entry.isDirectory()) {
yield* getFiles(fullPath);
} else {
yield fullPath;
}
}
}
for await (const filePath of getFiles('output')) {
const content = await fs.readFile(filePath);
const fileName = path.basename(filePath);
await github.rest.repos.uploadReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.data.id,
name: fileName,
data: content
});
}