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-30T15:44:33.256Z
Commit: 1511788d96ea (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).
Versions: vize vize 0.303.0 · tsgo Version 7.0.0-dev.20260602.1 · vue-tsc Version 6.0.3 (typescript n/a) · vue 3.6.0-beta.10 · eslint v10.4.1 · prettier 3.8.3 · node v24.14.0
Binaries (sha256):
Backend: native TypeScript engine ready at /home/runner/_work/vize/vize/node_modules/.bin/tsgo. Planted-diagnostic gating for the type-check rows lives in bench/check-gate.mjs (.github/workflows/check-bench.yml).
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.15s |
3.95s |
329.2ms |
52.1x |
| Large SFC compile |
1 |
@vue/compiler-sfc (1T) |
199.4ms |
66.5ms |
64.8ms |
3.1x |
| Large SFC type check |
1 |
vue-tsc |
1.75s |
251.0ms |
252.5ms |
n/a (cross-engine) |
| Lint |
15,000 |
eslint-plugin-vue (1T) |
56.20s |
1.96s |
324.8ms |
173.0x |
| Format |
15,000 |
Prettier CLI |
143.13s |
6.63s |
2.83s |
50.6x |
| Type check |
500 |
vue-tsc |
5.57s |
593.6ms |
498.1ms |
n/a (cross-engine) |
| Vite build (end-to-end) |
1,000 |
@vitejs/plugin-vue |
1.71s |
n/a |
631.7ms |
2.7x |
| Nuxt SPA build (end-to-end) |
500 |
Nuxt default compiler |
6.83s |
n/a |
6.59s |
1.0x |
Large SFC type check — engine classes ranked separately
| Engine class |
Row |
Median |
Relative to fastest in class |
| JS TypeScript engine (tsc) |
vue-tsc |
1.75s |
1.00x |
| native TypeScript engine (tsgo) |
Vize check (1T) |
251.0ms |
1.00x |
| native TypeScript engine (tsgo) |
Vize check (max) |
252.5ms |
1.01x |
No cross-class ratio is published for Large SFC type check: the incumbent runs the JavaScript TypeScript compiler while Vize runs native tsgo, so a single number would credit TypeScript's Go rewrite to the Vue layer.
Type check — engine classes ranked separately
| Engine class |
Row |
Median |
Relative to fastest in class |
| JS TypeScript engine (tsc) |
vue-tsc |
5.57s |
1.00x |
| native TypeScript engine (tsgo) |
Vize check (max) |
498.1ms |
1.00x |
| native TypeScript engine (tsgo) |
Vize check (1T) |
593.6ms |
1.19x |
No cross-class ratio is published for Type check: the incumbent runs the JavaScript TypeScript compiler while Vize runs native tsgo, so a single number would credit TypeScript's Go rewrite to the Vue layer.
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
compileSfcBatchWithResults wall time so the primary number includes generated output crossing the JS/native boundary; the stats-only native timeMs is shown only in variant details. Explicit sequence variants run 1→max and max→1 in one Node process and measure the second call's full JavaScript wall time, including scoped pool creation.
- Vite build timings exclude fixture copy/setup; the Vize max lane sets
precompileBatchSize to 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 build with Nuxt's default compiler against the same app with @vizejs/nuxt installed. Vue SFC compilation is roughly 2% of that build (measured on the 500-file corpus in #3426), so this row cannot be moved by making the Vue compiler faster — it is dominated by Nitro, Rollup and Nuxt's own module graph work. bench/nuxt-bridge-transform.mjs isolates the part of this surface Vize does own, the Nuxt module's per-module bridge transform.
- Single-thread lanes are shown where useful, and the primary speedup compares the incumbent default/single-thread lane with Vize's max runner lane.
- Type-check rows span two TypeScript engines: vue-tsc runs the JavaScript compiler while Vize check runs native tsgo (Corsa). No cross-engine ratio is published for that surface — it is ranked within each engine class instead, so TypeScript's Go rewrite is never credited to the Vue layer; bench/check-gate.mjs publishes the same per-engine-class split with planted-diagnostic gating.
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.15s |
874 files/s |
17.82s, 17.11s, 16.92s, 17.15s, 17.22s |
| @vue/compiler-sfc (32 workers) |
6.08s |
2.5k files/s |
6.08s, 6.16s, 6.03s, 6.16s, 5.80s |
| Vize native loop (1T) |
3.95s |
3.8k files/s |
3.85s, 3.89s, 3.95s, 4.13s, 3.97s |
| Vize native batch results (max) |
329.2ms |
45.6k files/s |
329.2ms, 326.5ms, 345.1ms, 328.9ms, 340.8ms |
| Vize native batch stats-only (core max) |
187.8ms |
79.9k files/s |
183.1ms, 185.3ms, 187.8ms, 194.0ms, 189.3ms |
| Vize batch sequence (1→32T, measures 32T) |
206.9ms |
72.5k files/s |
194.9ms, 206.9ms, 205.9ms, 212.4ms, 213.0ms |
| Vize batch sequence (32T→1, measures 1T) |
3.12s |
4.8k files/s |
3.29s, 3.30s, 3.09s, 3.12s, 3.11s |
Large SFC compile
| Variant |
Median |
Throughput |
Raw measured runs |
| @vue/compiler-sfc (1T) |
199.4ms |
5 files/s |
201.0ms, 191.2ms, 193.8ms, 200.3ms, 199.4ms |
| @vue/compiler-sfc (1 workers) |
468.0ms |
2 files/s |
454.4ms, 474.6ms, 475.4ms, 468.0ms, 466.3ms |
| Vize native loop (1T) |
66.5ms |
15 files/s |
74.9ms, 62.5ms, 66.5ms, 62.2ms, 75.2ms |
| Vize native batch results (max) |
64.8ms |
15 files/s |
66.7ms, 62.3ms, 63.3ms, 64.8ms, 67.8ms |
| Vize native batch stats-only (core max) |
58.8ms |
17 files/s |
58.6ms, 58.8ms, 57.0ms, 60.7ms, 59.1ms |
| Vize batch sequence (1→32T, measures 32T) |
52.0ms |
19 files/s |
57.5ms, 52.0ms, 51.8ms, 48.4ms, 52.6ms |
| Vize batch sequence (32T→1, measures 1T) |
52.2ms |
19 files/s |
52.2ms, 54.8ms, 56.1ms, 50.1ms, 50.1ms |
Large SFC type check
| Variant |
Median |
Throughput |
Raw measured runs |
| vue-tsc |
1.75s |
1 files/s |
1.78s, 1.78s, 1.70s, 1.69s, 1.75s |
| Vize check (1T) |
251.0ms |
4 files/s |
251.0ms, 257.8ms, 255.2ms, 248.0ms, 246.2ms |
| Vize check (max) |
252.5ms |
4 files/s |
261.7ms, 252.5ms, 263.2ms, 251.8ms, 245.6ms |
Lint
| Variant |
Median |
Throughput |
Raw measured runs |
| eslint-plugin-vue (1T) |
56.20s |
267 files/s |
56.78s, 57.54s, 55.60s, 56.20s, 54.77s |
| eslint-plugin-vue (32 workers) |
13.50s |
1.1k files/s |
13.85s, 13.55s, 13.42s, 13.50s, 13.48s |
| Vize lint (1T) |
1.96s |
7.7k files/s |
1.99s, 1.96s, 1.89s, 1.89s, 1.99s |
| Vize lint (max) |
324.8ms |
46.2k files/s |
320.8ms, 321.2ms, 341.6ms, 330.5ms, 324.8ms |
| Variant |
Median |
Throughput |
Raw measured runs |
| Prettier CLI |
143.13s |
105 files/s |
140.89s, 143.13s, 142.43s, 144.61s, 145.97s |
| Vize fmt (1T) |
6.63s |
2.3k files/s |
5.70s, 6.63s, 6.49s, 6.72s, 6.80s |
| Vize fmt (max) |
2.83s |
5.3k files/s |
7.83s, 2.83s, 2.75s, 2.56s, 3.04s |
Type check
| Variant |
Median |
Throughput |
Raw measured runs |
| vue-tsc |
5.57s |
90 files/s |
5.63s, 5.48s, 5.57s, 5.80s, 5.57s |
| Vize check (1T) |
593.6ms |
842 files/s |
595.2ms, 576.7ms, 593.7ms, 577.6ms, 593.6ms |
| Vize check (max) |
498.1ms |
1.0k files/s |
496.0ms, 498.1ms, 502.0ms, 512.5ms, 479.5ms |
Vite build (end-to-end)
| Variant |
Median |
Throughput |
Raw measured runs |
| @vitejs/plugin-vue |
1.71s |
584 files/s |
1.73s, 1.65s, 1.63s, 1.71s, 2.02s |
| @vizejs/vite-plugin |
631.7ms |
1.6k files/s |
782.5ms, 631.7ms, 635.4ms, 612.0ms, 616.3ms |
Nuxt SPA build (end-to-end)
| Variant |
Median |
Throughput |
Raw measured runs |
| Nuxt default compiler |
6.83s |
73 files/s |
6.83s, 6.62s, 6.78s, 6.98s, 7.01s |
| @vizejs/nuxt |
6.59s |
76 files/s |
6.59s, 6.42s, 6.29s, 6.60s, 6.71s |