Reproducible, cross-language benchmark suite for Plutus (UPLC) virtual machine implementations.
Builds 6 VMs from source inside Docker, runs each VM's native benchmark framework, and generates a unified comparison report. View full results
AMD Ryzen 9 9900X3D, 24 cores, 47 GB RAM, Ubuntu 24.04 (WSL2)
| VM | Language | Geo Mean | vs Fastest |
|---|---|---|---|
| Plutuz | Zig | 408 us | 1.00x |
| uplc-turbo | Rust | 495 us | 1.21x |
| Chrysalis (JIT) | C# / .NET | 549 us | 1.35x |
| Chrysalis (AOT) | C# / .NET | 567 us | 1.39x |
| blaze-plutus (V8) | TypeScript | 1.17 ms | 2.88x |
| blaze-plutus (JSC) | TypeScript | 1.18 ms | 2.89x |
| Plutigo | Go | 2.28 ms | 5.59x |
| opshin | Python | 169 ms | 414x |
Geometric mean of 78 plutus_use_cases scripts. Lower is better.
| VM | Language | Benchmark Framework | Repository |
|---|---|---|---|
| uplc-turbo | Rust | Criterion.rs | pragma-org/uplc |
| Plutuz | Zig | Custom (JSON) | utxo-company/plutuz |
| Chrysalis | C# / .NET | BenchmarkDotNet (JIT + AOT) | SAIB-Inc/Chrysalis |
| Plutigo | Go | testing.B | blinklabs-io/plutigo |
| blaze-plutus | TypeScript | Vitest bench (V8 + JSC) | butaneprotocol/blaze-cardano |
| opshin-uplc | Python | Custom | OpShin/uplc |
Each VM: flat-decode + CEK evaluate on 78 real-world Plutus smart contract scripts (auction, escrow, uniswap, stablecoin, etc.).
All VMs use the same canonical .flat test data committed in data/plutus_use_cases/.
# Build and run all benchmarks
docker compose up
# Or step by step
docker compose build
docker compose run --rm benchmark
# Run specific VMs only
docker compose run --rm -e BENCH_VMS=chrysalis,uplc-turbo benchmarkResults are written to ./results/<date>/:
unified.csv— all VMs, all scripts, nanosecond precisionreport.md— markdown comparison table with geometric means- Per-VM raw output logs
Edit .env to change pinned git SHAs, then rebuild:
# Edit .env with new SHAs
docker compose build --no-cache
docker compose run --rm benchmarkdata/plutus_use_cases/ # 78 canonical .flat benchmark scripts
Dockerfile # Multi-stage: build all VMs, single ubuntu:24.04 runtime
docker-compose.yml # One-command orchestration
.env # Pinned git SHAs and toolchain versions
scripts/ # Per-VM runner scripts + orchestrator
parsers/ # Output normalizers (one per framework)
report/ # Unified CSV -> markdown report generator
results/ # Git-tracked historical results
See METHODOLOGY.md for details on fairness, statistical methodology, and limitations.
See CONTRIBUTING.md for guidelines.
- Add Aiken UPLC (Rust, aiken-lang/aiken
crates/uplc) — needs custom bench harness, no native benchmarks exist - Add Haskell plutus-core (IOG reference implementation) — requires GHC + cabal Docker setup