benchmarks #

tsv is a Rust toolchain for parsing and formatting TypeScript/JS, CSS, and Svelte. Its formatter closely follows Prettier and borrows its architectural patterns, and we're grateful for the hard work of Prettier's contributors. After correctness, tsv prioritizes performance and efficiency: this page measures its speed and size on real-world code, and the conformance page compares parser coverage on edge-case test suites.

This page compares tsv to Prettier and the JS parsers it can replace (Svelte's and acorn-typescript), and to Oxc and Biome, similar tools with more features, configurable styles, and wider language support. It also measures rsvelte, yuku-parser, swc, dprint, Malva, markup_fmt, and PostCSS; Language support lays out what each parses and formats.

tldr
#

tsv formats its three languages faster than Oxc and Biome in every in-process pairing here, and its CLI outpaces theirs using less memory in every shared scenario. Its artifacts are smaller than theirs too, except against oxc-parser's native build, since tsv publishes no native parse-only build yet.

Except in the CLI section, every timing here is in-process and one file at a time, isolating engine speed from multi-core parallelism. The corpus is 3,580 files of real-world code, the author's own and Svelte's (see Corpus), timed under Node v24.

  • Formatting TypeScript, tsv is ~2.2x faster than Oxfmt (native-vs-native), ~36x faster than Prettier (native Rust vs Prettier's JS; ~26x as wasm), and ~7.6x faster than Biome (wasm-vs-wasm).
  • Formatting Svelte, tsv is ~79x faster than Prettier (~55x as wasm) and ~10x faster than Biome (wasm-vs-wasm).
  • Formatting CSS, tsv is ~3.6x faster than Oxfmt (native-vs-native), ~111x faster than Prettier (~78x as wasm), and ~12x faster than Biome (wasm-vs-wasm).
  • Parsing TypeScript to its default span-only AST (offsets only, like Oxc's), tsv is natively ~1.5x faster than oxc-parser (see Parse speed) and ~2.4x slower than yuku-parser (~3.3x as wasm). With {locations: true}, which adds acorn's per-node line/column loc, it is ~1.2x faster than acorn-typescript, the parser it can replace, and still ahead of Oxc and swc, whose ASTs carry none.
  • Parsing Svelte with {locations: true}, whose loc is a superset of Svelte's own, tsv is ~1.8x faster than svelte/compiler (JS) and ~3.1x faster than rsvelte (native-vs-native); its default span-only AST is ~2.4x faster than svelte/compiler.
  • Parsing CSS runs the other way: Svelte's own parseCss, whose AST tsv reproduces, is ~1.9x faster than tsv's default parse, and PostCSS ~1.6x faster (see Parse speed). Under Bun it flips: tsv's default parse leads parseCss by ~1.3x, with parseCss ~1.9x slower there than under Node.
  • End to end as a CLI, tsv formats the JSX-free subset of a real TypeScript repo ~1.6x faster than Oxfmt and ~4.0x faster than Biome (~2.7x and ~6.8x as the bare binary, without Node in front), using less memory than either. These are wall-clock ratios, so they include each tool's multi-file parallelism (see the CLI section).
  • On a third-party Svelte corpus, tsv's CLI, again through its Node bin, is ~3.0x faster than rsvelte-fmt, another Rust Svelte formatter.

Language support
#

Support matrix for Parsers and Formatters (bold is timed on this page, faded is supported but not timed):

toolTS/JSJSX/TSXCSSSCSS/LessSvelteother
tsvparses, timed; formats, timednoneparses, timed; formats, timednoneparses, timed; formats, timed
Prettierformats, timedformats, not timedformats, timedformats, not timedformats, via prettier-plugin-svelte, timedJSON, YAML, Markdown, GraphQL, HTML, Vue, …
svelte/compiler, acorn-typescriptparses, timedparses, with its jsx option, not timedparses, timednoneparses, timed
Oxcparses, timed; formats, timedparses, not timed; formats, not timedformats, timedformats, not timedformats, via the Prettier it bundles, opt-in, timedJSON, TOML, YAML, GraphQL, Markdown; MDX, HTML, Vue, … via Prettier
Biomeformats, timedformats, not timedformats, timednoneformats, experimental, behind a flag, timedJSON, GraphQL, GritQL, HTML (opt-in), and experimental Vue, Astro
rsvelteformats, with Oxc's formatters, not timedformats, with Oxc's formatters, not timedformats, with Oxc's formatters, not timedformats, with Oxc's formatters, not timedparses, timed; formats, timedJSON, and the rest of what oxfmt formats with oxfmt installed
@dprint/typescriptformats, timedformats, not timednonenonenonedprint's other plugins add JSON, Markdown, …; Malva and markup_fmt are listed below
Malvanonenoneformats, timedformats, not timednoneSass
markup_fmtnonenonenonenoneformats, with dprint's TypeScript and Malva plugins, not timedHTML, Vue, Astro, Angular, and template dialects (Jinja, Twig, Vento, …)
yuku-parserparses, timedparses, not timednonenonenone
swcparses, timedparses, not timednonenonenoneFlow
PostCSSnonenoneparses, timedparses, via a separate syntax package, not timednone

1 via prettier-plugin-svelte; 2 with its jsx option; 3 via the Prettier it bundles, opt-in; 4 experimental, behind a flag; 5 with Oxc's formatters; 6 with dprint's TypeScript and Malva plugins; 7 via a separate syntax package.

Format speed
#

Each chart's ratios are relative to its highlighted row, and a negative ratio means that many times worse. Hover another row to compare against it instead.

Formatting 923 Svelte files

prettier 5,378 ms 1.00x
biome (wasm) 998 ms 5.39x
markup_fmt (wasm) not timed
oxfmt (node napi) 5,352 ms 1.00x
rsvelte-fmt not timed
tsv-wasm 97 ms 55.4x
tsv (node napi) 68 ms 79.2x

6 of 929 files (3.5% of the group's bytes) are left out of every row, because biome (wasm) fails them in this harness.

Formatting 2,593 TypeScript/JS files

prettier 14,485 ms 1.00x
biome (wasm) 4,230 ms 3.42x
dprint (wasm) 3,312 ms 4.37x
oxfmt (node napi) 866 ms 16.7x
tsv-wasm 556 ms 26.1x
tsv (node napi) 398 ms 36.4x

3 of 2,596 files (<0.1% of the group's bytes) are left out of every row, because some rows fail them in this harness (per row, overlapping: oxfmt (node napi) 2, biome (wasm) 3).

Formatting 54 CSS files

prettier 572 ms 1.00x
biome (wasm) 87 ms 6.60x
malva (wasm) 47 ms 12.1x
oxfmt (node napi) 19 ms 30.7x
tsv-wasm 7.3 ms 78.2x
tsv (node napi) 5.2 ms 111.0x

1 of 55 files (9.9% of the group's bytes) is left out of every row, because biome (wasm) fails it in this harness.

Parse speed
#

tsv and oxc-parser, in its default mode, share a mechanism: both serialize the AST to JSON in Rust and hand it to the JS engine's JSON.parse, native and wasm alike. tsv is timed three ways:

  • tsv / tsv-wasm is what the parsers return by default: a span-only AST (start/end offsets, no loc) of Oxc's kind. It is the closest comparison with oxc-parser but not an equal one: Oxc's AST also writes out default-valued fields tsv omits (optional: false, decorators: [], typeAnnotation: null), about a third more bytes, and its parse also collects comments and module records. Oxc also has an experimental raw-transfer mode, untimed here, that skips the JSON and may well beat tsv natively.
  • +locations passes {locations: true}: the same parse with a loc (line/column) object on every node, rebuilt in JS from the offsets. That is acorn's shape on TypeScript, and on Svelte and CSS a superset of what their reference parsers carry. On the TypeScript corpus it takes ~1.2x the time of the default.
  • internal builds tsv's AST in Rust and stops: no serialization, nothing materialized in JS. These entries show raw engine speed. Their gap to the default entries is what serializing and handing off costs tsv, not a cross-tool comparison.

yuku-parser, a JS/TS parser written in Zig, emits the same span-only AST as Oxc, so it too compares against tsv's default entries. It hands JS a compact binary buffer that decodes into objects when its program is read, so the bench reads it to time the same fully materialized result. swc's AST (a Module root with span offsets) matches neither of tsv's outputs.

Parsing 929 Svelte files

svelte/compiler 349 ms 1.00x
biome n/a
rsvelte-parse (node napi) 586 ms −1.68x
rsvelte-parse skip-expr-loc (node napi) 383 ms −1.10x
tsv-wasm 161 ms 2.16x
tsv (node napi) 147 ms 2.38x
tsv-wasm+locations 206 ms 1.69x
tsv+locations (node napi) 192 ms 1.82x
tsv-wasm internal 24 ms 14.6x
tsv internal (node napi) 17 ms 21.1x

Parsing 2,593 TypeScript/JS files

acorn-typescript 1,382 ms 1.00x
biome n/a
oxc-parser (wasm) 1,430 ms −1.03x
oxc-parser (node napi) 1,372 ms 1.01x
swc (node napi) 1,769 ms −1.28x
yuku-parser (wasm) 301 ms 4.60x
yuku-parser (node napi) 382 ms 3.62x
tsv-wasm 988 ms 1.40x
tsv (node napi) 932 ms 1.48x
tsv-wasm+locations 1,187 ms 1.16x
tsv+locations (node napi) 1,133 ms 1.22x
tsv-wasm internal 135 ms 10.3x
tsv internal (node napi) 101 ms 13.6x

3 of 2,596 files (0.1% of the group's bytes) are left out of every row, because some rows fail them in this harness (per row, overlapping: acorn-typescript 3, oxc-parser (node napi) 2, oxc-parser (wasm) 2, yuku-parser (node napi) 2, yuku-parser (wasm) 2, swc (node napi) 3).

Parsing 55 CSS files

svelte/compiler 11 ms 1.00x
biome n/a
oxc-parser n/a
postcss 12 ms −1.15x
swc n/a
tsv-wasm 21 ms −1.96x
tsv (node napi) 19 ms −1.85x
tsv-wasm+locations 23 ms −2.22x
tsv+locations (node napi) 23 ms −2.22x
tsv-wasm internal 4.1 ms 2.54x
tsv internal (node napi) 2.8 ms 3.78x

End-to-end CLI benchmark
#

The numbers above time tsv's engine in-process, one file at a time. This section times the whole CLI end to end, on real code, as you'd experience it from the command line: process spawn, file discovery, I/O, and each tool's default multi-file parallelism, plus peak memory. It comes from a fork of Oxc's own bench-formatter that adds tsv. Upstream's other scenarios aren't shown: their corpora include JSX, which tsv doesn't parse, and two also format a repo's other languages and embedded code, one sorting imports and Tailwind classes too.

As in the charts above, each table's ratios are relative to its highlighted row: tsv via Node dispatcher where tsv faces other tools, and the bare tsv binary in the tsv-only table.

TypeScript repo: Outline repository (non-JSX JS/TS subset)

Every formatter scoped to the same JSX-free files, each at its default parallelism.

formattertimetime ratioCPU ratiopeak RSSRSS ratio
tsv44 ms1.70x1.09x20 MiB2.42x
tsv via Node dispatcher74 ms1.00x1.00x49 MiB1.00x
oxfmt117 ms−1.57x−1.97x227 MiB−4.60x
biome298 ms−4.00x−5.83x145 MiB−2.94x
prettier + oxc-parser6.9 s−92.5x−23.1x304 MiB−6.16x
prettier8.4 s−112.6x−36.8x453 MiB−9.17x

Corpus: commit 8cf997c (2026-07-14), 1,648 files. Each time is the mean of 10 runs after 3 warmups.

Large single file: TypeScript compiler parser.ts (~540KB)

With one input, no formatter can parallelize across files, so wall-clock time comes nearer to engine speed plus startup. Startup is each tool’s own process and thread-pool setup, plus Node’s for every row but the bare tsv binary: a fixed cost that weighs most on the fastest rows.

formattertimetime ratioCPU ratiopeak RSSRSS ratio
tsv16 ms2.82x2.97x13 MiB3.70x
tsv via Node dispatcher46 ms1.00x1.00x50 MiB1.00x
oxfmt61 ms−1.32x−1.92x112 MiB−2.26x
biome107 ms−2.33x−2.36x96 MiB−1.94x
prettier + oxc-parser976 ms−21.1x−27.5x196 MiB−3.97x
prettier1.6 s−34.8x−49.7x306 MiB−6.18x

Corpus: 539,588 bytes, sha256:dcddb577aa14, 1 file. Each time is the mean of 20 runs after 3 warmups.

Svelte corpus: third-party .svelte corpus (kit, svelte.dev, layerchart, svelte-ux, flowbite-svelte src/lib, svelte-maplibre, layercake)

Two Rust-native Svelte formatters head-to-head. rsvelte-fmt’s time includes the Oxfmt it launches for the file types it doesn’t format itself, which walks the corpus and finds none.

formattertimetime ratioCPU ratiopeak RSSRSS ratio
tsv25 ms2.23x1.15x12 MiB4.12x
tsv via Node dispatcher56 ms1.00x1.00x50 MiB1.00x
rsvelte-fmt165 ms−2.96x−5.31x155 MiB−3.13x

Corpus: fuzdev/corpora@63d1790 (collections tree 9b64dd2), snapshot ce81fe8 (2026-10-02), 1,091 files. Each time is the mean of 10 runs after 3 warmups.

tsv delivery paths: TypeScript compiler parser.ts (~540KB), through each tsv distribution

Every row is tsv, delivered three ways: the native binary; the same binary through @fuzdev/tsv’s Node dispatcher; and @fuzdev/tsv-wasm, tsv’s CLI reimplemented in JS over a wasm engine, the package for platforms without a prebuilt binary. The corpus is one file, so the gaps are launch and engine cost, not file parallelism. In time, tsv-wasm still finishes well ahead of both Prettier rows in the single-file table, but behind Oxfmt and Biome.

formattertimetime ratioCPU ratiopeak RSSRSS ratio
tsv17 ms1.00x1.00x13 MiB1.00x
tsv via Node dispatcher47 ms−2.86x−3.01x49 MiB−3.69x
tsv-wasm158 ms−9.55x−27.3x122 MiB−9.09x

Corpus: 539,588 bytes, sha256:dcddb577aa14, 1 file. Each time is the mean of 20 runs after 3 warmups.

This section ran on October 7, 2026, from its harness at 453198a, on the same machine and Node as the in-process runs (12 threads). The versions of the tools both sections time are listed under Benchmarking details; its native tsv rows run the @fuzdev/tsv-linux-x64-gnu binary, and its wasm row @fuzdev/tsv-wasm 0.6.0.

Binary size
#

The size of each tool's artifact, split by where it runs and grouped by what it does. Bars and ratios are raw bytes; the gz beside each estimates the download. tsv-wasm, tsv (napi), and tsv (ffi) are tsv's full builds: parser and formatter for Svelte, TypeScript/JS, and CSS in one artifact. The format-only and parse-only builds are subsets of them.

In the browser: wasm and JS
#

Full toolchain (parse + format)

prettier + parsers (js bundle) 2.2 MB 567 KB gz 1.00x
tsv-wasm 2.7 MB 1.0 MB gz −1.22x
biome (wasm) 46.9 MB 11.9 MB gz −21.2x

Formatter

malva (wasm) 1.5 MB 414 KB gz 1.00x
markup_fmt (wasm) 2.0 MB 557 KB gz −1.36x
prettier + svelte plugin (js bundle) 2.2 MB 567 KB gz −1.51x
tsv-format-wasm 2.4 MB 948 KB gz −1.66x
dprint (wasm) 4.2 MB 1.2 MB gz −2.85x
oxfmt (wasm) n/a

Parser

svelte + acorn typescript parsers (js bundle) 500 KB 125 KB gz 1.00x
yuku-parser (wasm) 699 KB 203 KB gz −1.40x
tsv-parse-wasm 1.0 MB 397 KB gz −2.00x
oxc-parser (wasm) 1.5 MB 481 KB gz −2.97x

Native builds
#

Full toolchain (parse + format)

tsv (ffi) 3.6 MB 1.7 MB gz 1.11x
tsv (napi) 4.0 MB 1.8 MB gz 1.00x
oxc-parser + oxfmt (napi) 10.9 MB 4.5 MB gz −2.77x

Formatter

tsv format (ffi) 3.3 MB 1.5 MB gz 1.21x
tsv (napi) 4.0 MB 1.8 MB gz 1.00x
oxfmt (napi) 8.8 MB 3.7 MB gz −2.24x
rsvelte-fmt (binary) 9.1 MB 3.6 MB gz −2.29x

Parser

yuku-parser (napi) 681 KB 286 KB gz 5.81x
tsv parse (ffi) 1.6 MB 699 KB gz 2.54x
oxc-parser (napi) 2.1 MB 881 KB gz 1.88x
tsv (napi) 4.0 MB 1.8 MB gz 1.00x
swc (napi) 10.5 MB 10.2 MB gz −2.67x
rsvelte compiler (napi) 17.8 MB 7.5 MB gz −4.51x

Cross-runtime
#

The same harness runs under three JS runtimes: Node, Deno, and Bun. The in-process charts above are the Node run, chosen as the default N-API host, not for speed. The native entry differs by runtime: Node and Bun load tsv's N-API addon; Deno loads its C-ABI library (the (ffi) build), which shares the addon's code but crosses a different binding boundary and is built differently. So a per-runtime delta on the same row comes from the JS engine, the host's N-API implementation, or that binding and build, not from tsv's algorithms.

Times are per sweep: one full pass over the group's timed file set, as in the charts above. Ratios are relative to node, negative when slower. The other tools' native rows are their npm N-API addons under all three runtimes.

A ≈ marks a delta inside the two measurements' combined noise: read it as parity. The check has two limits. Each side's noise is the spread of a row's few passes, each a fresh process, which is a thin estimate, so an unmarked delta near it isn't necessarily an effect. And it can't see variance between whole runs.

  • node 24.14.1
  • deno 2.9.7
  • bun 1.4.2

Format Svelte

implementationnodedenobundeno vs nodebun vs node
prettier5,378 ms5,044 ms4,271 ms ⚠1.07x1.26x
tsv (native)68 ms67 ms66 ms1.01x1.02x
tsv-wasm97 ms108 ms95 ms−1.12x1.02x
oxfmt (native)5,352 ms5,099 ms4,402 ms1.05x1.22x
biome (wasm)998 ms929 ms860 ms1.07x1.16x

Format TypeScript/JS

implementationnodedenobundeno vs nodebun vs node
prettier14,485 ms13,355 ms ⚠14,224 ms ⚠1.08x1.02x
tsv (native)398 ms380 ms377 ms1.05x1.06x
tsv-wasm556 ms628 ms543 ms−1.13x1.02x
oxfmt (native)866 ms846 ms830 ms≈1.02x1.04x
biome (wasm)4,230 ms4,387 ms3,876 ms−1.04x1.09x
dprint (wasm)3,312 ms3,728 ms3,205 ms−1.13x1.03x

Format CSS

implementationnodedenobundeno vs nodebun vs node
prettier572 ms550 ms467 ms1.04x1.22x
tsv (native)5.2 ms4.6 ms4.6 ms1.13x1.12x
tsv-wasm7.3 ms8.3 ms6.3 ms−1.14x1.17x
oxfmt (native)19 ms18 ms18 ms1.03x1.04x
biome (wasm)87 ms95 ms81 ms−1.09x1.07x
malva (wasm)47 ms51 ms56 ms−1.09x−1.19x

Parse Svelte

implementationnodedenobundeno vs nodebun vs node
svelte/compiler349 ms329 ms367 ms1.06x−1.05x
tsv (native)147 ms131 ms104 ms1.12x1.41x
tsv-wasm161 ms161 ms112 ms≈1.00x1.44x
tsv+locations (native)192 ms185 ms148 ms1.04x1.30x
tsv-wasm+locations206 ms215 ms159 ms−1.04x1.30x
tsv internal (native)17 ms16 ms14 ms1.03x1.15x
tsv-wasm internal24 ms27 ms23 ms−1.14x1.03x
rsvelte-parse (native)586 ms559 ms500 ms1.05x1.17x
rsvelte-parse skip-expr-loc (native)383 ms364 ms336 ms1.05x1.14x

Parse TypeScript/JS

implementationnodedenobundeno vs nodebun vs node
acorn-typescript1,382 ms1,036 ms1,300 ms1.33x1.06x
tsv (native)932 ms789 ms597 ms1.18x1.56x
tsv-wasm988 ms953 ms623 ms1.04x1.58x
tsv+locations (native)1,133 ms1,003 ms793 ms1.13x1.43x
tsv-wasm+locations1,187 ms1,163 ms824 ms1.02x1.44x
tsv internal (native)101 ms91 ms81 ms1.11x1.25x
tsv-wasm internal135 ms156 ms124 ms−1.16x1.09x
oxc-parser (native)1,372 ms1,216 ms853 ms1.13x1.61x
oxc-parser (wasm)1,430 ms1,348 ms1,029 ms ⚠1.06x1.39x
yuku-parser (native)382 ms439 ms327 ms−1.15x1.17x
yuku-parser (wasm)301 ms378 ms245 ms−1.26x1.23x
swc (native)1,769 ms1,603 ms1,339 ms1.10x1.32x

Parse CSS

implementationnodedenobundeno vs nodebun vs node
svelte/compiler11 ms10 ms20 ms1.03x−1.88x
tsv (native)19 ms16 ms15 ms1.18x1.32x
tsv-wasm21 ms20 ms13 ms1.02x1.61x
tsv+locations (native)23 ms21 ms20 ms1.11x1.18x
tsv-wasm+locations23 ms25 ms17 ms−1.05x1.37x
tsv internal (native)2.8 ms2.5 ms2.3 ms1.10x1.19x
tsv-wasm internal4.1 ms4.5 ms3.3 ms−1.10x1.24x
postcss12 ms12 ms17 ms≈−1.01x−1.42x

Benchmarking details
#

Each row is the mean time per sweep, a pass over its group's timed file set. Within a group every tool is timed on the same files — the intersection of what every timed tool accepted, so a file one rejects drops out for everyone. The count above each chart is that intersection, and a chart that runs short of the corpus total says beneath it what was left out and which rows failed it.

These are warm numbers: every row runs warmup sweeps before it is timed, so a cold one-shot call pays more. Each native or wasm call also pays a string encode across the binding boundary, and a decode wherever it hands back text or JSON, which the JS tools skip.

Each row is timed in 3 passes, and each pass runs until it has both a few seconds of sweeps and at least 8 sweeps, so the slow rows stop at that floor in every pass. After outlier cleaning, rows keep from 21 to 4,880 timings across their passes. A steady reading over a few dozen sweeps is thinner evidence than one over hundreds, so the harness's check for unstable rows proves less for the slow rows, those that ran fewer than twice the floor's sweeps. Prettier, every format chart's default anchor, is among them in each format group:

  • Format Svelte: prettier, oxfmt, biome-wasm
  • Format TypeScript/JS: every row
  • Format CSS: prettier
  • Parse Svelte: svelte/compiler, rsvelte-parse, rsvelte-parse-skip-expr-loc
  • Parse TypeScript/JS: acorn-typescript, tsv, tsv-wasm, tsv+locations, tsv-wasm+locations, oxc-parser, oxc-parser-wasm, yuku-parser, swc

Every pass of every row runs in a fresh process that loads that row's tool and nothing else, so no tool's code, garbage, or warmed-up state is shared with the next. Each pass takes a group's rows in a different order (forward, reversed, then rotated), so no row always runs right after the same one, and a row's number is the average of its passes. What no process boundary removes is the machine: nothing pins the process to a core or holds the laptop CPU's clock steady. Two fresh processes of the same row sat 1% apart at the median and 3% at the 95th percentile in this run, so a ratio inside that isn't a difference the run measured. A row whose passes sat 5% or more apart is flagged as unstable, and no row's timings shift more than 2% from the first half of a pass to its second.

One asymmetry isn't isolated. Oxfmt's programmatic format is async-only, so each call's timing includes an N-API task dispatch and a promise resolution that tsv's sync call doesn't pay. (Prettier's is async-only too, without the N-API hop.) Oxfmt's native work may also run off the JS thread: still one file at a time, since each call is awaited before the next, but not strictly one thread.

versions

  • svelte 5.57.2
  • acorn 8.19.0
  • @sveltejs/acorn-typescript 1.0.13
  • prettier 3.9.9
  • prettier-plugin-svelte 4.1.1
  • oxc-parser 0.153.0
  • @oxc-parser/binding-wasm32-wasi 0.142.0
  • oxfmt 0.72.0
  • yuku-parser 0.17.0
  • @yuku-core/wasm 0.17.0
  • @biomejs/wasm-bundler 2.5.15
  • @dprint/typescript 0.96.1
  • dprint-plugin-malva 0.16.0
  • markup 0.27.5
  • postcss 8.5.29
  • @rsvelte/fmt 0.7.25
  • @rsvelte/vite-plugin-svelte-native 0.3.17
  • rsvelte's upstream svelte 5.57.1
  • @swc/core 1.16.13

run

environment

  • AMD Ryzen 5 PRO 7530U with Radeon Graphics
  • linux/x86_64
  • node 24.14.1

Corpus
#

Every in-process timing on this page comes from 3,580 .svelte, .ts/.js, and .css files of real-world code, vendored in the fuzdev/corpora@63d1790 snapshot so one clone reproduces it. They're the author's libraries, apps, and sites (the fuz.dev ecosystem plus personal SvelteKit projects), and upstream framework source (Svelte, SvelteKit, and the svelte.dev site).

  • The snapshot's community Svelte libraries and tooling are left out: they would dominate the Svelte set. The CLI section's Svelte corpus draws on them.
  • Test files count as real code and stay in. Fixture files (formatter test suites, and fixture subtrees inside the measured repos) are out: deliberately tricky edge cases measure conformance, not typical throughput, and the conformance page covers them.
  • Standalone CSS files are rare in this ecosystem, so the CSS set adds the <style> blocks of the corpus's Svelte components, concatenated per corpus collection — 20 of its 55 entries. Even so, CSS is the weakest sample, with just 35 standalone files.
  • The corpus is the author's own code plus Svelte's, the same code tsv is developed and tested against and mostly tsv-formatted already. Input already in a tool's own style may format faster, which would favor tsv. Read every ratio here as "on this corpus", not as a universal figure.
By source

Each source links its upstream at the commit the snapshot vendored.

sourcecommitfilesSvelteTypeScript/JSCSS
all sources3,5809292,59655
fuzdev/zzz c7f4d153261731521
fuzdev/fuz_app 2f76810695336611
fuzdev/fuz_blog f8a11c73821161
fuzdev/fuz_code 55de4336617463
fuzdev/fuz_css cf9f4bf170431252
fuzdev/fuz_docs 3ad0d026646191
fuzdev/fuz_repos d043dee9928701
fuzdev/fuz_mastodon d44985a251591
fuzdev/fuz_template 3f2464e181071
fuzdev/fuz_ui 87809cb2361281080
fuzdev/fuz_util 144fcfc14781381
fuzdev/mdz 9edec8e7021481
fuzdev/gro 777467f161101510
fuzdev/svelte-docinfo 48d7b6211922961
fuzdev/tsv.fuz.dev d91025a3317151
ryanatkn/ryanatkn.com f299ca05231201
ryanatkn/webdevladder.net 7f1873a3924141
ryanatkn/earbetter 5d2ecd97244262
ryanatkn/cosmicplayground fa3efae217131842
harvested <style> blocks 200020
sveltejs/kit b27c82f22742230
sveltejs/svelte 5ccdfe341604160
sveltejs/svelte.dev apps/svelte.dev/src996bd6314560850
sveltejs/svelte.dev packages/repl/src996bd635317342
sveltejs/svelte.dev packages/site-kit/src996bd6370263311