Blacksmith Benchmark Snapshot
This page is generated from the Tool Benchmark workflow so published performance numbers can cite one reproducible runner, input corpus, and commit.
Latest Result
Measured: 2026-06-07T12:20:39.431Z
Commit: 41c983ca7ce0 (run)
Runner: blacksmith-32vcpu-ubuntu-2404 (32 logical CPU, AMD EPYC, 32 vCPU / 128 GB RAM / 1.5 TB storage)
Input: 15,000 generated SFC files (36.9 MB). Median of 5 measured run(s) after 1 warmup run(s).
Large SFC: 900 repeated template blocks (674.9 KB). Nuxt import set: 500 SFC files.
| Surface | Files | Existing tool | Existing median | Vize 1T | Vize max | Speedup |
|---|---|---|---|---|---|---|
| SFC compile | 15,000 | @vue/compiler-sfc (1T) | 8.64s | 2.57s | 259.4ms | 33.3x |
| Large SFC compile | 1 | @vue/compiler-sfc (1T) | 197.5ms | 66.3ms | 62.8ms | 3.1x |
| Large SFC type check | 1 | vue-tsc | 1.58s | 161.2ms | 163.2ms | 9.7x |
| Lint | 15,000 | eslint-plugin-vue (1T) | 40.71s | 1.18s | 215.0ms | 189.3x |
| Format | 15,000 | Prettier CLI | 81.53s | 3.57s | 1.32s | 61.7x |
| Type check | 500 | vue-tsc | 3.86s | 634.6ms | 596.8ms | 6.5x |
| Vite build (end-to-end) | 1,000 | @vitejs/plugin-vue | 953.2ms | n/a | 466.9ms | 2.0x |
| Nuxt SPA build (end-to-end) | 500 | Nuxt default compiler | 5.08s | n/a | 4.92s | 1.0x |
Fairness notes:
All tools run on the same generated Vue SFC corpus from the same checkout and lockfile.
The 15,000-SFC rows are the many-file workload; the large-SFC rows isolate one large component.
Reported times are medians; measured runs alternate variant order after warmup runs.
Destructive formatter runs receive a fresh copy of the same input before each invocation.
SFC compile Vize max uses
compileSfcBatchWithResultswall time so the primary number includes generated output crossing the JS/native boundary; the stats-only nativetimeMsis shown only in variant details.Vite build timings exclude fixture copy/setup; the Vize max lane sets
precompileBatchSizeto the benchmark file count so Blacksmith max runs one native precompile batch instead of the memory-safe default chunks.Nuxt SPA build timings exclude synthetic app generation and compare
nuxt buildwith Nuxt's default compiler against the same app with@vizejs/nuxtinstalled.Single-thread lanes are shown where useful, and the primary speedup compares the incumbent default/single-thread lane with Vize's max runner lane.
Commands:
gh workflow run tool-benchmark.yml --ref <branch> -f file_count=15000 -f check_file_count=500 -f vite_file_count=1000 -f nuxt_file_count=500 -f large_blocks=900 -f runs=5 -f warmups=1 -f commit_results=true
node bench/generate.mjs 15000
node bench/compare-tools.mjs --input bench/__in__ --vize-bin target/release/vize --runs 5 --warmups 1 --check-file-count 500 --vite-file-count 1000 --nuxt-file-count 500 --large-blocks 900 --runner-label "blacksmith-32vcpu-ubuntu-2404" --out tool-benchmark-summary.md --json tool-benchmark-results.json --doc performance-blacksmith.md
Variant details and raw run times
SFC compile
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| @vue/compiler-sfc (1T) | 8.64s | 1.7k files/s | 8.80s, 8.46s, 8.62s, 8.64s, 8.81s |
| @vue/compiler-sfc (32 workers) | 3.09s | 4.9k files/s | 3.28s, 3.09s, 2.98s, 3.06s, 3.38s |
| Vize native loop (1T) | 2.57s | 5.8k files/s | 2.45s, 2.51s, 2.57s, 2.73s, 2.58s |
| Vize native batch results (max) | 259.4ms | 57.8k files/s | 245.5ms, 259.4ms, 260.4ms, 250.7ms, 267.5ms |
| Vize native batch stats-only (core max) | 23.0ms | 653.2k files/s | 23.0ms, 22.8ms, 23.7ms, 22.8ms, 25.0ms |
Large SFC compile
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| @vue/compiler-sfc (1T) | 197.5ms | 5 files/s | 200.8ms, 197.5ms, 197.8ms, 194.2ms, 186.5ms |
| @vue/compiler-sfc (1 workers) | 444.5ms | 2 files/s | 444.5ms, 442.8ms, 442.5ms, 445.4ms, 474.7ms |
| Vize native loop (1T) | 66.3ms | 15 files/s | 67.9ms, 62.7ms, 66.3ms, 62.0ms, 72.8ms |
| Vize native batch results (max) | 62.8ms | 16 files/s | 62.5ms, 62.8ms, 63.1ms, 61.7ms, 68.0ms |
| Vize native batch stats-only (core max) | 61.7ms | 16 files/s | 61.8ms, 61.7ms, 61.6ms, 60.9ms, 62.5ms |
Large SFC type check
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| vue-tsc | 1.58s | 1 files/s | 1.65s, 1.63s, 1.58s, 1.57s, 1.58s |
| Vize check (1T) | 161.2ms | 6 files/s | 161.2ms, 161.2ms, 164.7ms, 161.1ms, 162.6ms |
| Vize check (max) | 163.2ms | 6 files/s | 164.8ms, 160.1ms, 163.7ms, 163.2ms, 161.4ms |
Lint
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| eslint-plugin-vue (1T) | 40.71s | 368 files/s | 40.71s, 41.25s, 40.58s, 40.96s, 40.58s |
| eslint-plugin-vue (32 workers) | 10.67s | 1.4k files/s | 10.73s, 10.38s, 10.67s, 10.37s, 10.93s |
| Vize lint (1T) | 1.18s | 12.7k files/s | 1.22s, 1.15s, 1.15s, 1.20s, 1.18s |
| Vize lint (max) | 215.0ms | 69.8k files/s | 207.4ms, 212.3ms, 215.0ms, 215.4ms, 218.5ms |
Format
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| Prettier CLI | 81.53s | 184 files/s | 82.33s, 80.63s, 81.80s, 80.42s, 81.53s |
| Vize fmt (1T) | 3.57s | 4.2k files/s | 3.57s, 3.62s, 3.40s, 3.59s, 3.57s |
| Vize fmt (max) | 1.32s | 11.3k files/s | 1.33s, 1.29s, 1.30s, 1.33s, 1.32s |
Type check
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| vue-tsc | 3.86s | 130 files/s | 3.93s, 3.86s, 3.90s, 3.73s, 3.84s |
| Vize check (1T) | 634.6ms | 788 files/s | 616.0ms, 636.9ms, 634.6ms, 628.8ms, 646.8ms |
| Vize check (max) | 596.8ms | 838 files/s | 596.8ms, 591.7ms, 609.5ms, 590.7ms, 602.4ms |
Vite build (end-to-end)
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| @vitejs/plugin-vue | 953.2ms | 1.0k files/s | 998.0ms, 1.13s, 946.1ms, 951.3ms, 953.2ms |
| @vizejs/vite-plugin | 466.9ms | 2.1k files/s | 466.9ms, 429.1ms, 468.1ms, 474.0ms, 430.7ms |
Nuxt SPA build (end-to-end)
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| Nuxt default compiler | 5.08s | 98 files/s | 5.10s, 5.12s, 5.08s, 4.98s, 4.88s |
| @vizejs/nuxt | 4.92s | 102 files/s | 4.79s, 4.92s, 4.98s, 4.92s, 4.91s |