mirror of
https://github.com/LukeHagar/wasm-overhead-research.git
synced 2025-12-06 04:22:06 +00:00
542 lines
17 KiB
TOML
542 lines
17 KiB
TOML
[tools]
|
||
go = "1.24"
|
||
"rust" = { version = "1.83.0" }
|
||
|
||
# ============================================================================
|
||
# Individual Implementation Build Tasks
|
||
# ============================================================================
|
||
|
||
# Basic implementation - Go
|
||
[tasks."build:basic:go"]
|
||
description = "Build basic implementation with Go"
|
||
env.GOOS = "js"
|
||
env.GOARCH = "wasm"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building basic implementation with Go..."
|
||
mkdir -p assets/wasm
|
||
go mod tidy > /dev/null 2>&1
|
||
go build -trimpath -o main.wasm implementations/basic/main.go
|
||
gzip -9 -c main.wasm > assets/wasm/lib.wasm.gz
|
||
rm main.wasm
|
||
cp "$(go env GOROOT)/lib/wasm/wasm_exec.js" assets/wasm/wasm_exec.js
|
||
echo "✅ Basic Go build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
# Basic implementation - TinyGo
|
||
[tasks."build:basic:tinygo"]
|
||
description = "Build basic implementation with TinyGo"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building basic implementation with TinyGo..."
|
||
if ! command -v tinygo >/dev/null 2>&1; then
|
||
echo "❌ Error: TinyGo is not installed"
|
||
exit 1
|
||
fi
|
||
mkdir -p assets/wasm
|
||
go mod tidy > /dev/null 2>&1
|
||
tinygo build -target wasm -o main.wasm implementations/basic/main.go
|
||
gzip -9 -c main.wasm > assets/wasm/lib.wasm.gz
|
||
rm main.wasm
|
||
cp "$(tinygo env TINYGOROOT)/targets/wasm_exec.js" assets/wasm/wasm_exec.js
|
||
echo "✅ Basic TinyGo build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
# Goja implementation - Go only (doesn't work with TinyGo)
|
||
[tasks."build:goja:go"]
|
||
description = "Build goja implementation with Go"
|
||
env.GOOS = "js"
|
||
env.GOARCH = "wasm"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building goja implementation with Go..."
|
||
mkdir -p assets/wasm
|
||
go mod tidy > /dev/null 2>&1
|
||
go build -trimpath -o main.wasm implementations/goja/main.go
|
||
gzip -9 -c main.wasm > assets/wasm/lib.wasm.gz
|
||
rm main.wasm
|
||
cp "$(go env GOROOT)/lib/wasm/wasm_exec.js" assets/wasm/wasm_exec.js
|
||
echo "✅ Goja Go build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
# Javy implementation
|
||
[tasks."build:javy"]
|
||
description = "Build Javy implementation (JavaScript to WASM)"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building Javy implementation..."
|
||
if ! command -v javy >/dev/null 2>&1; then
|
||
echo "❌ Error: Javy CLI is not installed or not on PATH"
|
||
echo "Please install the Javy CLI from https://github.com/bytecodealliance/javy"
|
||
exit 1
|
||
fi
|
||
mkdir -p assets/wasm
|
||
cd implementations/javy
|
||
javy emit-plugin -o plugin.wasm
|
||
javy build -C dynamic -C plugin=plugin.wasm -o transform_dynamic.wasm transform.js
|
||
cd ../..
|
||
gzip -9 -c implementations/javy/transform_dynamic.wasm > assets/wasm/lib.wasm.gz
|
||
echo "✅ Javy build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
# Porffor implementation
|
||
[tasks."build:porffor"]
|
||
description = "Build Porffor implementation (AOT JavaScript to WASM)"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building Porffor implementation..."
|
||
mkdir -p assets/wasm
|
||
cd implementations/porffor
|
||
npx porf wasm transform.js transform.wasm
|
||
cd ../..
|
||
gzip -9 -c implementations/porffor/transform.wasm > assets/wasm/lib.wasm.gz
|
||
echo "✅ Porffor build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
# QuickJS implementation
|
||
[tasks."build:quickjs"]
|
||
description = "Build QuickJS implementation (Rust + QuickJS)"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building QuickJS implementation..."
|
||
if ! command -v cargo >/dev/null 2>&1; then
|
||
echo "❌ Error: Rust/Cargo is not installed"
|
||
exit 1
|
||
fi
|
||
mkdir -p assets/wasm
|
||
cd implementations/quickjs
|
||
cargo build --target wasm32-wasip1 --release
|
||
cd ../..
|
||
gzip -9 -c implementations/quickjs/target/wasm32-wasip1/release/quickjs_transform.wasm > assets/wasm/lib.wasm.gz
|
||
echo "✅ QuickJS build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
# AssemblyScript implementation
|
||
[tasks."build:assemblyscript"]
|
||
description = "Build AssemblyScript implementation with json-as"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building AssemblyScript implementation..."
|
||
if ! command -v npm >/dev/null 2>&1; then
|
||
echo "❌ Error: npm is not installed"
|
||
exit 1
|
||
fi
|
||
mkdir -p assets/wasm
|
||
cd implementations/assemblyscript
|
||
npm install --legacy-peer-deps > /dev/null 2>&1
|
||
npm run asbuild > /dev/null 2>&1
|
||
cd ../..
|
||
gzip -9 -c implementations/assemblyscript/build/release.wasm > assets/wasm/lib.wasm.gz
|
||
echo "✅ AssemblyScript build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
# AssemblyScript optimized implementation
|
||
[tasks."build:assemblyscript:optimized"]
|
||
description = "Build optimized AssemblyScript implementation"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building optimized AssemblyScript implementation..."
|
||
mkdir -p assets/wasm
|
||
cd implementations/assemblyscript
|
||
npm install --legacy-peer-deps > /dev/null 2>&1
|
||
npm run asbuild > /dev/null 2>&1
|
||
if command -v wasm-opt >/dev/null 2>&1; then
|
||
wasm-opt -Oz --enable-bulk-memory --strip-debug --strip-dwarf --strip-producers --converge build/release.wasm -o build/release_opt.wasm
|
||
mv build/release_opt.wasm build/release.wasm
|
||
fi
|
||
cd ../..
|
||
gzip -9 -c implementations/assemblyscript/build/release.wasm > assets/wasm/lib.wasm.gz
|
||
echo "✅ AssemblyScript optimized build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
|
||
# ============================================================================
|
||
# Optimized Build Tasks
|
||
# ============================================================================
|
||
|
||
[tasks."build:basic:go:optimized"]
|
||
description = "Build basic implementation with optimized Go"
|
||
env.GOOS = "js"
|
||
env.GOARCH = "wasm"
|
||
env.CGO_ENABLED = "0"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building basic implementation with optimized Go..."
|
||
mkdir -p assets/wasm
|
||
go mod tidy > /dev/null 2>&1
|
||
go build -ldflags="-s -w -buildid=" -gcflags="-l=4 -B -C" -trimpath -o main.wasm implementations/basic/main.go
|
||
if command -v wasm-opt >/dev/null 2>&1; then
|
||
wasm-opt -Oz --enable-bulk-memory --enable-sign-ext --converge main.wasm -o main_opt.wasm
|
||
mv main_opt.wasm main.wasm
|
||
fi
|
||
gzip -9 -c main.wasm > assets/wasm/lib.wasm.gz
|
||
rm main.wasm
|
||
cp "$(go env GOROOT)/lib/wasm/wasm_exec.js" assets/wasm/wasm_exec.js
|
||
echo "✅ Basic optimized Go build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
[tasks."build:basic:tinygo:optimized"]
|
||
description = "Build basic implementation with optimized TinyGo"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building basic implementation with optimized TinyGo..."
|
||
if ! command -v tinygo >/dev/null 2>&1; then
|
||
echo "❌ Error: TinyGo is not installed"
|
||
exit 1
|
||
fi
|
||
mkdir -p assets/wasm
|
||
go mod tidy > /dev/null 2>&1
|
||
tinygo build -target wasm -no-debug -gc=leaking -opt=z -size=full -panic=trap -o main.wasm implementations/basic/main.go
|
||
if command -v wasm-opt >/dev/null 2>&1; then
|
||
wasm-opt -Oz --enable-bulk-memory --enable-sign-ext --enable-mutable-globals --converge --all-features main.wasm -o main_opt.wasm
|
||
mv main_opt.wasm main.wasm
|
||
fi
|
||
gzip -9 -c main.wasm > assets/wasm/lib.wasm.gz
|
||
rm main.wasm
|
||
cp "$(tinygo env TINYGOROOT)/targets/wasm_exec.js" assets/wasm/wasm_exec.js
|
||
echo "✅ Basic optimized TinyGo build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
[tasks."build:goja:go:optimized"]
|
||
description = "Build goja implementation with optimized Go"
|
||
env.GOOS = "js"
|
||
env.GOARCH = "wasm"
|
||
env.CGO_ENABLED = "0"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building goja implementation with optimized Go..."
|
||
mkdir -p assets/wasm
|
||
go mod tidy > /dev/null 2>&1
|
||
go build -ldflags="-s -w -buildid=" -gcflags="-l=4 -B -C" -trimpath -o main.wasm implementations/goja/main.go
|
||
if command -v wasm-opt >/dev/null 2>&1; then
|
||
wasm-opt -Oz --enable-bulk-memory --enable-sign-ext --converge main.wasm -o main_opt.wasm
|
||
mv main_opt.wasm main.wasm
|
||
fi
|
||
gzip -9 -c main.wasm > assets/wasm/lib.wasm.gz
|
||
rm main.wasm
|
||
cp "$(go env GOROOT)/lib/wasm/wasm_exec.js" assets/wasm/wasm_exec.js
|
||
echo "✅ Goja optimized Go build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
|
||
[tasks."build:porffor:optimized"]
|
||
description = "Build Porffor implementation with optimization"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building optimized Porffor implementation..."
|
||
mkdir -p assets/wasm
|
||
cd implementations/porffor
|
||
npx porf wasm -O3 transform.js transform.wasm
|
||
cd ../..
|
||
gzip -9 -c implementations/porffor/transform.wasm > assets/wasm/lib.wasm.gz
|
||
echo "✅ Porffor optimized build complete: $(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
"""
|
||
|
||
# ============================================================================
|
||
# Individual Test Tasks (with dependencies on builds)
|
||
# ============================================================================
|
||
|
||
[tasks."test:basic:go"]
|
||
description = "Test basic implementation with Go build"
|
||
depends = ["build:basic:go"]
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Testing basic Go implementation..."
|
||
npm install > /dev/null 2>&1
|
||
npx vitest run --reporter=verbose
|
||
"""
|
||
|
||
[tasks."test:basic:tinygo"]
|
||
description = "Test basic implementation with TinyGo build"
|
||
depends = ["build:basic:tinygo"]
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Testing basic TinyGo implementation..."
|
||
npm install > /dev/null 2>&1
|
||
npx vitest run --reporter=verbose
|
||
"""
|
||
|
||
[tasks."test:goja:go"]
|
||
description = "Test goja implementation with Go build"
|
||
depends = ["build:goja:go"]
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Testing goja Go implementation..."
|
||
npm install > /dev/null 2>&1
|
||
npx vitest run --reporter=verbose
|
||
"""
|
||
|
||
|
||
[tasks."test:javy"]
|
||
description = "Test Javy implementation"
|
||
depends = ["build:javy"]
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Testing Javy implementation..."
|
||
node -e "import('./implementations/javy/javy-adapter.js').then(async (javy) => {
|
||
console.log('🚀 Javy adapter loaded');
|
||
try {
|
||
const health = await javy.healthCheck();
|
||
console.log('💓 Health check:', JSON.parse(health).status);
|
||
const result = await javy.transformData('{\"name\":\"test\",\"value\":42}');
|
||
const parsed = JSON.parse(result);
|
||
console.log('🔄 Transform test:', parsed.engine === 'javy' ? 'PASS' : 'FAIL');
|
||
console.log('✅ Javy tests passed!');
|
||
} catch (error) {
|
||
console.error('❌ Javy test failed:', error.message);
|
||
process.exit(1);
|
||
}
|
||
}).catch(console.error);"
|
||
"""
|
||
|
||
[tasks."test:porffor"]
|
||
description = "Test Porffor implementation"
|
||
depends = ["build:porffor"]
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Testing Porffor implementation..."
|
||
if command -v wasmer >/dev/null 2>&1; then
|
||
cd implementations/porffor
|
||
if [ -f porffor-wasmer-test.sh ]; then
|
||
./porffor-wasmer-test.sh
|
||
else
|
||
echo "⚠️ Porffor test script not found"
|
||
fi
|
||
else
|
||
echo "⚠️ Wasmer not installed, skipping Porffor WASI test"
|
||
fi
|
||
"""
|
||
|
||
[tasks."test:quickjs"]
|
||
description = "Test QuickJS implementation"
|
||
depends = ["build:quickjs"]
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Testing QuickJS implementation..."
|
||
if [ -f implementations/quickjs/quickjs-wasi-test.js ]; then
|
||
node implementations/quickjs/quickjs-wasi-test.js
|
||
elif command -v wasmer >/dev/null 2>&1; then
|
||
cd implementations/quickjs
|
||
if [ -f quickjs-wasmer-test.sh ]; then
|
||
./quickjs-wasmer-test.sh
|
||
else
|
||
echo "⚠️ QuickJS test script not found"
|
||
fi
|
||
else
|
||
echo "⚠️ No QuickJS test available"
|
||
fi
|
||
"""
|
||
|
||
[tasks."test:assemblyscript"]
|
||
description = "Test AssemblyScript implementation"
|
||
depends = ["build:assemblyscript"]
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Testing AssemblyScript implementation..."
|
||
cd implementations/assemblyscript
|
||
node test.js
|
||
"""
|
||
|
||
# ============================================================================
|
||
# Master Test Task - depends on all individual tests
|
||
# ============================================================================
|
||
|
||
[tasks.test]
|
||
description = "Run all working implementation tests"
|
||
depends = [
|
||
"test:basic:go",
|
||
"test:basic:tinygo",
|
||
"test:goja:go",
|
||
"test:porffor",
|
||
"test:quickjs",
|
||
"test:assemblyscript"
|
||
]
|
||
run = """
|
||
echo "✅ All working tests completed successfully!"
|
||
echo ""
|
||
echo "Note: Skipped implementations:"
|
||
echo " - javy (CLI not available via npm package)"
|
||
"""
|
||
|
||
# ============================================================================
|
||
# Build All Task - builds all implementations
|
||
# ============================================================================
|
||
|
||
[tasks."build:all"]
|
||
description = "Build all implementations"
|
||
depends = [
|
||
"build:basic:go",
|
||
"build:basic:tinygo",
|
||
"build:goja:go",
|
||
"build:javy",
|
||
"build:porffor",
|
||
"build:quickjs",
|
||
"build:assemblyscript"
|
||
]
|
||
run = """
|
||
echo "✅ All builds completed successfully!"
|
||
"""
|
||
|
||
[tasks."build:all:optimized"]
|
||
description = "Build all implementations with optimization"
|
||
depends = [
|
||
"build:basic:go:optimized",
|
||
"build:basic:tinygo:optimized",
|
||
"build:goja:go:optimized",
|
||
"build:porffor:optimized",
|
||
"build:quickjs",
|
||
"build:assemblyscript:optimized"
|
||
]
|
||
run = """
|
||
echo "✅ All optimized builds completed successfully!"
|
||
"""
|
||
|
||
# ============================================================================
|
||
# Utility Tasks
|
||
# ============================================================================
|
||
|
||
[tasks.clean]
|
||
description = "Clean build artifacts and node_modules"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Cleaning build artifacts..."
|
||
rm -rf assets/
|
||
rm -f main.wasm main.wasm.gz
|
||
rm -rf node_modules/
|
||
rm -f implementations/javy/*.wasm
|
||
rm -f implementations/porffor/*.wasm
|
||
rm -rf implementations/quickjs/target/
|
||
echo "✅ Clean complete"
|
||
"""
|
||
|
||
[tasks."size:compare"]
|
||
description = "Compare sizes of all implementations"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Building and comparing all implementations..."
|
||
echo ""
|
||
echo "| Implementation | Compiler | Size (gzipped) |"
|
||
echo "|----------------|----------|----------------|"
|
||
|
||
# Basic - Go
|
||
mise run build:basic:go > /dev/null 2>&1
|
||
printf "| Basic | Go | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
# Basic - Go Optimized
|
||
mise run build:basic:go:optimized > /dev/null 2>&1
|
||
printf "| Basic | Go (opt) | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
# Basic - TinyGo
|
||
mise run build:basic:tinygo > /dev/null 2>&1
|
||
printf "| Basic | TinyGo | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
# Basic - TinyGo Optimized
|
||
mise run build:basic:tinygo:optimized > /dev/null 2>&1
|
||
printf "| Basic | TinyGo (opt) | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
# Goja - Go
|
||
mise run build:goja:go > /dev/null 2>&1
|
||
printf "| Goja | Go | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
# Goja - Go Optimized
|
||
mise run build:goja:go:optimized > /dev/null 2>&1
|
||
printf "| Goja | Go (opt) | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
# Javy
|
||
if command -v javy >/dev/null 2>&1; then
|
||
mise run build:javy > /dev/null 2>&1
|
||
printf "| Javy | Dynamic | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
fi
|
||
|
||
# Porffor
|
||
mise run build:porffor > /dev/null 2>&1
|
||
printf "| Porffor | AOT | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
mise run build:porffor:optimized > /dev/null 2>&1
|
||
printf "| Porffor | AOT (opt) | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
# QuickJS
|
||
mise run build:quickjs > /dev/null 2>&1
|
||
printf "| QuickJS | Rust | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
# AssemblyScript
|
||
mise run build:assemblyscript > /dev/null 2>&1
|
||
printf "| AssemblyScript | AssemblyScript | %s |\n" "$(du -h assets/wasm/lib.wasm.gz | cut -f1)"
|
||
|
||
echo ""
|
||
echo "✅ Size comparison complete!"
|
||
"""
|
||
|
||
# ============================================================================
|
||
# Benchmark Tasks
|
||
# ============================================================================
|
||
|
||
[tasks."benchmark:all"]
|
||
description = "Run comprehensive benchmarks for all implementations"
|
||
depends = ["build:all:optimized"]
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Running comprehensive benchmarks..."
|
||
node --expose-gc benchmark.js
|
||
echo "✅ Benchmarks complete! Results saved to results/"
|
||
"""
|
||
|
||
[tasks."benchmark:wasmer"]
|
||
description = "Benchmark implementations with Wasmer runtime"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Benchmarking with Wasmer runtime..."
|
||
if ! command -v wasmer >/dev/null 2>&1; then
|
||
echo "❌ Error: Wasmer is not installed"
|
||
echo "Please install Wasmer from https://wasmer.io/"
|
||
exit 1
|
||
fi
|
||
node benchmark-wasmer.js
|
||
echo "✅ Wasmer benchmarks complete! Results saved to results/wasmer/"
|
||
"""
|
||
|
||
[tasks."benchmark:extism"]
|
||
description = "Benchmark implementations with Extism runtime"
|
||
run = """
|
||
set -euo pipefail
|
||
echo "Benchmarking with Extism runtime..."
|
||
node benchmark-extism.js
|
||
echo "✅ Extism benchmarks complete! Results saved to results/extism/"
|
||
"""
|
||
|
||
[tasks."benchmark:regenerate"]
|
||
description = "Regenerate all benchmark data"
|
||
depends = ["benchmark:all", "benchmark:wasmer", "benchmark:extism"]
|
||
run = """
|
||
echo "✅ All benchmark data regenerated!"
|
||
"""
|
||
|
||
# ============================================================================
|
||
# Runtime SDK Evaluation Tasks
|
||
# ============================================================================
|
||
|
||
[tasks."measure:runtimes:all"]
|
||
description = "Measure all runtime SDK overhead"
|
||
run = "cd runtimes && ./measure_all.sh"
|
||
|
||
[tasks."measure:wasmer:python"]
|
||
description = "Measure Wasmer Python SDK overhead"
|
||
run = "cd runtimes/wasmer/python && python3 measure.py"
|
||
|
||
[tasks."measure:wasmer:typescript"]
|
||
description = "Measure Wasmer TypeScript SDK overhead"
|
||
run = "cd runtimes/wasmer/typescript && npm install --silent && npx tsx measure.ts"
|
||
|
||
[tasks."measure:wasmer:go"]
|
||
description = "Measure Wasmer Go SDK overhead"
|
||
run = "cd runtimes/wasmer/go && ./measure.sh"
|
||
|
||
[tasks."measure:extism:python"]
|
||
description = "Measure Extism Python SDK overhead"
|
||
run = "cd runtimes/extism/python && python3 measure.py"
|
||
|
||
[tasks."build:test-modules"]
|
||
description = "Build test WASM modules for runtime evaluation"
|
||
run = "cd runtimes/test-modules && python3 create_test_modules.py"
|
||
|