Skip to content

Benchmark Generators #1

Benchmark Generators

Benchmark Generators #1

Workflow file for this run

name: Benchmark Generator
on:
workflow_dispatch:
permissions:
contents: read
actions: write
jobs:
benchmark:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '25'
- uses: jbangdev/setup-jbang@main
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.13'
- name: Build fat JAR
run: jbang export fatjar --force --output html-generators/generate.jar html-generators/generate.java
- name: Build AOT cache
run: java -XX:AOTCacheOutput=html-generators/generate.aot -jar html-generators/generate.jar
- name: Run benchmark
shell: bash
run: |
JAR="html-generators/generate.jar"
AOT="html-generators/generate.aot"
RUNS=6
snippet_count=$(find content -name '*.json' | wc -l | tr -d ' ')
java_ver=$(java -version 2>&1 | head -1 | sed 's/.*"\(.*\)".*/\1/')
os_name="${{ matrix.os }}"
# Timing helper using bash TIMEFORMAT
measure() {
TIMEFORMAT='%R'
local t
t=$( { time "$@" > /dev/null 2>&1; } 2>&1 )
echo "$t"
}
bench() {
local label="$1"; shift
local times=()
for ((i = 1; i <= RUNS; i++)); do
t=$(measure "$@")
times+=("$t")
done
local cold="${times[0]}"
local sum=0
for ((i = 1; i < RUNS; i++)); do
sum=$(awk "BEGIN {print $sum + ${times[$i]}}")
done
local warm
warm=$(awk "BEGIN {printf \"%.2f\", $sum / ($RUNS - 1)}")
echo "${label}|${cold}|${warm}"
}
echo "Running benchmark on $os_name (Java $java_ver, $snippet_count snippets)..."
aot_result=$(bench "Fat JAR + AOT" java -XX:AOTCache="$AOT" -jar "$JAR")
jar_result=$(bench "Fat JAR" java -jar "$JAR")
jbang_result=$(bench "JBang" jbang html-generators/generate.java)
python_result=$(bench "Python" python3 html-generators/generate.py)
# Write to GitHub Actions Job Summary
{
echo "## Benchmark Results — \`$os_name\`"
echo ""
echo "Java $java_ver · $snippet_count snippets · $RUNS runs (1 cold + $((RUNS - 1)) warm)"
echo ""
echo "| Method | Cold Start | Warm Average |"
echo "|--------|-----------|-------------|"
for result in "$aot_result" "$jar_result" "$jbang_result" "$python_result"; do
IFS='|' read -r label cold warm <<< "$result"
echo "| **$label** | ${cold}s | ${warm}s |"
done
} >> "$GITHUB_STEP_SUMMARY"