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-07-09T10:06:01.799Z
Commit: 27fe77df7c87 (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 (58.7 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) | 17.54s | 3.23s | 290.8ms | 60.3x |
| Large SFC compile | 1 | @vue/compiler-sfc (1T) | 192.6ms | 62.6ms | 56.3ms | 3.4x |
| Large SFC type check | 1 | vue-tsc | 1.69s | 178.7ms | 178.0ms | 9.5x |
| Lint | 15,000 | eslint-plugin-vue (1T) | 54.32s | 1.91s | 279.3ms | 194.5x |
| Format | 15,000 | Prettier CLI | 143.61s | 10.15s | 1.79s | 80.3x |
| Type check | 500 | vue-tsc | 5.36s | 500.5ms | 430.1ms | 12.5x |
| Vite build (end-to-end) | 1,000 | @vitejs/plugin-vue | 1.66s | n/a | 732.5ms | 2.3x |
| Nuxt SPA build (end-to-end) | 500 | Nuxt default compiler | 6.79s | n/a | 6.42s | 1.1x |
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) | 17.54s | 855 files/s | 17.88s, 17.59s, 17.49s, 17.54s, 17.32s |
| @vue/compiler-sfc (32 workers) | 5.90s | 2.5k files/s | 5.89s, 5.90s, 5.86s, 5.95s, 6.09s |
| Vize native loop (1T) | 3.23s | 4.6k files/s | 3.10s, 3.13s, 3.36s, 3.36s, 3.23s |
| Vize native batch results (max) | 290.8ms | 51.6k files/s | 290.8ms, 272.9ms, 302.8ms, 274.7ms, 302.9ms |
| Vize native batch stats-only (core max) | 178.8ms | 83.9k files/s | 172.9ms, 174.3ms, 178.8ms, 180.3ms, 180.1ms |
Large SFC compile
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| @vue/compiler-sfc (1T) | 192.6ms | 5 files/s | 192.6ms, 192.6ms, 197.2ms, 195.9ms, 190.7ms |
| @vue/compiler-sfc (1 workers) | 479.8ms | 2 files/s | 468.3ms, 475.4ms, 479.8ms, 555.9ms, 493.1ms |
| Vize native loop (1T) | 62.6ms | 16 files/s | 62.6ms, 55.1ms, 65.2ms, 57.1ms, 65.0ms |
| Vize native batch results (max) | 56.3ms | 18 files/s | 54.8ms, 54.3ms, 56.3ms, 56.4ms, 56.8ms |
| Vize native batch stats-only (core max) | 55.7ms | 18 files/s | 56.7ms, 53.4ms, 55.7ms, 55.3ms, 55.8ms |
Large SFC type check
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| vue-tsc | 1.69s | 1 files/s | 1.70s, 1.72s, 1.68s, 1.62s, 1.69s |
| Vize check (1T) | 178.7ms | 6 files/s | 176.2ms, 178.4ms, 179.1ms, 189.4ms, 178.7ms |
| Vize check (max) | 178.0ms | 6 files/s | 177.7ms, 178.0ms, 177.5ms, 189.5ms, 194.5ms |
Lint
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| eslint-plugin-vue (1T) | 54.32s | 276 files/s | 54.32s, 54.44s, 53.47s, 54.35s, 54.06s |
| eslint-plugin-vue (32 workers) | 13.47s | 1.1k files/s | 13.41s, 13.61s, 13.63s, 13.26s, 13.47s |
| Vize lint (1T) | 1.91s | 7.9k files/s | 1.88s, 1.84s, 1.91s, 1.91s, 1.97s |
| Vize lint (max) | 279.3ms | 53.7k files/s | 275.8ms, 272.1ms, 287.9ms, 287.1ms, 279.3ms |
Format
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| Prettier CLI | 143.61s | 104 files/s | 142.61s, 142.38s, 143.61s, 145.98s, 144.94s |
| Vize fmt (1T) | 10.15s | 1.5k files/s | 10.10s, 10.26s, 10.15s, 10.43s, 9.82s |
| Vize fmt (max) | 1.79s | 8.4k files/s | 1.78s, 1.79s, 1.82s, 1.82s, 1.78s |
Type check
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| vue-tsc | 5.36s | 93 files/s | 5.46s, 5.36s, 5.50s, 5.34s, 5.36s |
| Vize check (1T) | 500.5ms | 999 files/s | 489.1ms, 513.6ms, 500.5ms, 504.0ms, 491.2ms |
| Vize check (max) | 430.1ms | 1.2k files/s | 427.4ms, 430.1ms, 421.3ms, 438.8ms, 431.3ms |
Vite build (end-to-end)
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| @vitejs/plugin-vue | 1.66s | 601 files/s | 1.65s, 1.61s, 1.69s, 1.66s, 1.95s |
| @vizejs/vite-plugin | 732.5ms | 1.4k files/s | 732.5ms, 713.2ms, 746.2ms, 691.9ms, 752.8ms |
Nuxt SPA build (end-to-end)
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| Nuxt default compiler | 6.79s | 74 files/s | 6.74s, 6.73s, 6.86s, 6.89s, 6.79s |
| @vizejs/nuxt | 6.42s | 78 files/s | 6.36s, 6.42s, 6.31s, 6.50s, 6.50s |