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-12T10:10:23.793Z
Commit: 07a1b83f49e4 (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) | 16.86s | 3.37s | 292.8ms | 57.6x |
| Large SFC compile | 1 | @vue/compiler-sfc (1T) | 194.5ms | 62.8ms | 61.2ms | 3.2x |
| Large SFC type check | 1 | vue-tsc | 1.61s | 172.3ms | 182.5ms | 8.8x |
| Lint | 15,000 | eslint-plugin-vue (1T) | 55.54s | 1.85s | 260.7ms | 213.1x |
| Format | 15,000 | Prettier CLI | 139.17s | 4.34s | 1.43s | 97.5x |
| Type check | 500 | vue-tsc | 5.37s | 438.5ms | 402.4ms | 13.3x |
| Vite build (end-to-end) | 1,000 | @vitejs/plugin-vue | 1.63s | n/a | 611.0ms | 2.7x |
| Nuxt SPA build (end-to-end) | 500 | Nuxt default compiler | 6.65s | n/a | 6.04s | 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) | 16.86s | 890 files/s | 17.87s, 17.09s, 16.75s, 16.86s, 16.78s |
| @vue/compiler-sfc (32 workers) | 5.96s | 2.5k files/s | 6.05s, 5.66s, 5.96s, 5.79s, 5.98s |
| Vize native loop (1T) | 3.37s | 4.4k files/s | 3.37s, 3.23s, 3.43s, 3.36s, 3.37s |
| Vize native batch results (max) | 292.8ms | 51.2k files/s | 287.7ms, 281.1ms, 299.5ms, 292.8ms, 295.2ms |
| Vize native batch stats-only (core max) | 183.5ms | 81.8k files/s | 178.3ms, 179.5ms, 183.5ms, 187.6ms, 188.1ms |
Large SFC compile
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| @vue/compiler-sfc (1T) | 194.5ms | 5 files/s | 194.5ms, 189.4ms, 189.6ms, 200.8ms, 203.6ms |
| @vue/compiler-sfc (1 workers) | 473.7ms | 2 files/s | 457.3ms, 473.7ms, 497.9ms, 535.7ms, 439.6ms |
| Vize native loop (1T) | 62.8ms | 16 files/s | 62.8ms, 57.6ms, 68.7ms, 61.8ms, 72.1ms |
| Vize native batch results (max) | 61.2ms | 16 files/s | 57.0ms, 56.5ms, 63.9ms, 61.2ms, 65.0ms |
| Vize native batch stats-only (core max) | 62.4ms | 16 files/s | 57.1ms, 55.8ms, 62.8ms, 62.4ms, 63.9ms |
Large SFC type check
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| vue-tsc | 1.61s | 1 files/s | 1.62s, 1.61s, 1.61s, 1.67s, 1.58s |
| Vize check (1T) | 172.3ms | 6 files/s | 190.5ms, 173.0ms, 166.2ms, 170.6ms, 172.3ms |
| Vize check (max) | 182.5ms | 5 files/s | 185.4ms, 189.8ms, 166.9ms, 182.5ms, 170.6ms |
Lint
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| eslint-plugin-vue (1T) | 55.54s | 270 files/s | 56.24s, 53.69s, 52.88s, 56.12s, 55.54s |
| eslint-plugin-vue (32 workers) | 12.91s | 1.2k files/s | 12.99s, 12.78s, 12.91s, 12.78s, 13.11s |
| Vize lint (1T) | 1.85s | 8.1k files/s | 1.85s, 1.81s, 1.86s, 1.81s, 1.86s |
| Vize lint (max) | 260.7ms | 57.5k files/s | 260.7ms, 259.8ms, 263.6ms, 257.0ms, 266.7ms |
Format
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| Prettier CLI | 139.17s | 108 files/s | 142.21s, 146.25s, 139.03s, 138.49s, 139.17s |
| Vize fmt (1T) | 4.34s | 3.5k files/s | 4.38s, 4.42s, 4.28s, 4.31s, 4.34s |
| Vize fmt (max) | 1.43s | 10.5k files/s | 1.45s, 1.43s, 1.40s, 1.40s, 1.43s |
Type check
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| vue-tsc | 5.37s | 93 files/s | 5.37s, 5.22s, 5.26s, 5.44s, 5.49s |
| Vize check (1T) | 438.5ms | 1.1k files/s | 437.2ms, 433.7ms, 438.5ms, 443.1ms, 449.5ms |
| Vize check (max) | 402.4ms | 1.2k files/s | 398.4ms, 398.8ms, 402.4ms, 411.3ms, 403.6ms |
Vite build (end-to-end)
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| @vitejs/plugin-vue | 1.63s | 613 files/s | 1.61s, 1.64s, 1.63s, 1.55s, 1.87s |
| @vizejs/vite-plugin | 611.0ms | 1.6k files/s | 611.0ms, 797.4ms, 621.0ms, 605.8ms, 594.4ms |
Nuxt SPA build (end-to-end)
| Variant | Median | Throughput | Raw measured runs |
|---|---|---|---|
| Nuxt default compiler | 6.65s | 75 files/s | 6.65s, 6.44s, 6.64s, 6.71s, 6.70s |
| @vizejs/nuxt | 6.04s | 83 files/s | 6.04s, 5.97s, 6.01s, 6.15s, 6.09s |