Benchmarks
These benchmarks compare dot against commonly used JavaScript validation libraries using the same schemas, data, runners, and bundlers. They are about user outcomes, not lab purity. Concrete improvements are welcome: if you see a better way to measure something, please open an issue or pull request.
The benchmarks do not test who has the longest feature list. They test common boundary-validation work that each library supports.
Any callouts about dot’s performance or advantages are scoped to this benchmark harness and its fixtures.
Setup
Each benchmark fixture runs in a separate process to isolate V8 warmup, optimization, and deoptimization state between tests.
Toolchain
- esbuild: 0.28.1
- mitata: 1.0.34
- rollup: 4.62.2
Environment
- Node.js 26.1.0
- TypeScript: 6.0.3
- macOS Tahoe 25.5.1
- 128 GB RAM
- Clock: ~4.46 GHz
- CPU: Apple M4 Max
Absolute timings vary by machine; relative comparisons are much more useful.
Libraries Tested
These benchmarks focus on function-style and fluent validators. Libraries such as TypeBox and ArkType, whose compiled schemas dominate cached comparisons, are excluded because they use a different validation model based on code-generation. Zod v4 uses a code-generation technique for an object fast path, but code-generation is not its primary validation model. The other validators in this test, including dot, do not leverage code-generation.
It is common knowledge that compiled C executes faster than an interpreted language. A benchmark proving this merely states the obvious. This is similar to a code-generation vs. interpreted validator.
Lines of Code (LOC) are source-code lines counted with tests, benchmarks, comments, and blank lines excluded. Commits identify the source checkout used for LOC and file counts.
| Name | Version | Commit | Files | LOC |
|---|---|---|---|---|
| dot | 0.8.1 | 3c0c96d | 38 | 2,376 |
| zod v4 | 4.4.3 | bbc68f99 | 82 | 17,758 |
| zod v3 | 3.25.76 | bbc68f99 | 13 | 5,021 |
| zod/mini | 4.4.3 | bbc68f99 | 79 | 16,445 |
| valibot | 1.4.1 | ff7c8d54 | 566 | 25,709 |
| yup | 1.7.1 | ff31eee | 33 | 3,981 |
| joi | 18.2.3 | c86ddc0 | 31 | 9,388 |
| superstruct | 2.0.2 | e414c8a | 9 | 1,194 |
| runtypes | 7.0.4 | 16d83ca | 54 | 2,587 |
Reproduce
The harness is documented in detail so these results can be reproduced. If you are curious, you can have the benchmarks running in a couple of minutes.
Installation
git clone git@github.com:sajajs/dot.git dot
cd dot
npm install
cd benchmarks
npm installRun Benchmarks
The benchmarks must be executed from the $REPO_ROOT/benchmarks directory.
# run performance benchmarks
npm run perf
# run performance benchmarks for selected libraries
# library name: dot, zod-v4, zod-v3, zod-mini, valibot, yup, joi, superstruct, runtypes.
npm run perf -- zod-v4 yup
# run bundle benchmarks
npm run bundle
# update Figures 2 and 3 after replacing the performance tables below
npm run sync-svg
# verify the figures without writing files
npm run check-svgFixture Scope
This benchmark suite is closed to new fixture categories for now. At roughly 4x dot’s source code, it is already large enough for the workloads it was designed to measure. Bug reports and corrections to existing fixtures are welcome.
Bundle Size
This benchmark compares bundled library size, not validation performance. The fixtures are the same, with minor differences due to library APIs. The boolean test bundles a single boolean schema, and the http test bundles a large HTTP request schema. Validation is called only to prevent bundlers from optimizing the schema away. For the http test, {} is passed as input so the benchmark measures the bundled library and schema code, not the size of HTTP request data.
Bundle Summary
Dot is not always the smallest bundle. Function-style validators can be smaller in highly tree-shaken cases. Dot’s distinction is that it stays in that weight class while still providing a fluent API.
Figure 1. Absolute Bundle Size
Values are gzip sizes from the Bundle Size tables.
Detailed Bundle Results
boolean
| lib | rollup min | rollup gzip | esbuild min | esbuild gzip |
|---|---|---|---|---|
| dot | 2.91 KB | 1.25 KB | 20.09 KB | 4.00 KB |
| zod v4 | 31.66 KB | 9.03 KB | 319.52 KB | 63.42 KB |
| zod v3 | 51.70 KB | 11.67 KB | 58.19 KB | 13.85 KB |
| zod/mini | 5.57 KB | 2.12 KB | 6.34 KB | 2.57 KB |
| valibot | 1.36 KB | 0.70 KB | 1.69 KB | 0.81 KB |
| superstruct | 2.54 KB | 1.11 KB | 2.64 KB | 1.16 KB |
| runtypes | 12.06 KB | 3.79 KB | 13.61 KB | 4.20 KB |
| joi | 187.89 KB | 58.82 KB | 172.53 KB | 54.68 KB |
| yup | 23.62 KB | 8.20 KB | 41.11 KB | 13.14 KB |
http
| lib | rollup min | rollup gzip | esbuild min | esbuild gzip |
|---|---|---|---|---|
| dot | 21.95 KB | 4.75 KB | 23.87 KB | 5.15 KB |
| zod v4 | 69.89 KB | 18.37 KB | 322.76 KB | 64.33 KB |
| zod v3 | 55.37 KB | 12.70 KB | 61.54 KB | 14.77 KB |
| zod/mini | 25.54 KB | 7.65 KB | 25.65 KB | 8.01 KB |
| valibot | 11.77 KB | 3.25 KB | 12.02 KB | 3.41 KB |
| superstruct | 7.80 KB | 3.06 KB | 7.92 KB | 3.12 KB |
| runtypes | 19.57 KB | 5.95 KB | 20.55 KB | 6.42 KB |
| joi | 190.81 KB | 59.76 KB | 175.35 KB | 55.74 KB |
| yup | 41.58 KB | 13.23 KB | 43.20 KB | 13.97 KB |
Summary (relative to dot)
| test | lib | rollup min | rollup gzip | esbuild min | esbuild gzip |
|---|---|---|---|---|---|
| boolean | zod v4 | 10.9x larger | 7.22x larger | 15.9x larger | 15.9x larger |
| boolean | zod v3 | 17.8x larger | 9.33x larger | 2.90x larger | 3.46x larger |
| boolean | zod/mini | 1.92x larger | 1.70x larger | 3.17x smaller | 1.55x smaller |
| boolean | valibot | 2.13x smaller | 1.78x smaller | 11.9x smaller | 4.95x smaller |
| boolean | superstruct | 1.14x smaller | 1.13x smaller | 7.61x smaller | 3.44x smaller |
| boolean | runtypes | 4.15x larger | 3.03x larger | 1.48x smaller | 1.05x larger |
| boolean | joi | 64.7x larger | 47.0x larger | 8.59x larger | 13.7x larger |
| boolean | yup | 8.13x larger | 6.56x larger | 2.05x larger | 3.29x larger |
| http | zod v4 | 3.18x larger | 3.86x larger | 13.5x larger | 12.5x larger |
| http | zod v3 | 2.52x larger | 2.67x larger | 2.58x larger | 2.87x larger |
| http | zod/mini | 1.16x larger | 1.61x larger | 1.07x larger | 1.56x larger |
| http | valibot | 1.86x smaller | 1.46x smaller | 1.99x smaller | 1.51x smaller |
| http | superstruct | 2.81x smaller | 1.56x smaller | 3.02x smaller | 1.65x smaller |
| http | runtypes | 1.12x smaller | 1.25x larger | 1.16x smaller | 1.25x larger |
| http | joi | 8.69x larger | 12.6x larger | 7.35x larger | 10.8x larger |
| http | yup | 1.89x larger | 2.78x larger | 1.81x larger | 2.71x larger |
Performance
The performance benchmark is organized by schema size and mode.
All libraries are run with the same input data. These benchmarks measure successful boundary validation. Invalid-input diagnostics are a different workload.
Mitata can report misleading memory numbers, including occasional values that are not plausible. Treat memory results as informational. Use timing results for comparisons.
Schema Size
Schema size can be small, plain, medium, large, xlarge, or huge.
| size | props validated | step growth |
|---|---|---|
| small | 3 | - |
| plain | 22 | 7.33x |
| medium | 30 | 1.36x |
| large | 46 | 1.53x |
| xlarge | 182 | 3.96x |
| huge | 727 | 3.99x |
The plain schema differs from the others. It is designed to have no constraints or mutation, so it measures floor validator overhead. Its 22 properties are simple primitive and container checks such as dot.string(), z.number(), arrays, records, and one small nested object.
The schemas are functionally equivalent across libraries, with minor differences due to API nuances.
Schema Mode
Mode can be cached or inline. In cached mode, the schema is constructed before the benchmark, so the test measures validation only. In inline mode, the schema is constructed inside the benchmark, so construction and validation are timed as a single unit.
Cached fixtures perform one validation before measurement, so the cached validation path is warmed. Inline fixtures measure schema construction and validation together without a separate warmup.
Dot provides over 20 opt-in prebuilt schemas outside core: including email, URL, and UUID. The medium, large, xlarge, and huge fixtures reconstruct these schemas rather than importing them, ensuring inline benchmarks include their construction cost. Each fixture contains a comment with more information.
Performance Summary
Inline ratios relative to dot are not linear. From small through large, many ratios narrow as schema construction is amortized by additional validation work. At xlarge and huge, many widen again as expanded workloads make validation scaling a larger part of the result.
Inline mode makes construction cost visible in the ratios. For libraries with higher construction cost, hoisting schemas can be an important optimization.
Dot has a different cost model. Schema construction is small enough that inline validation remains practical. That allows callers to organize code around meaning, not validator overhead.
Figure 2. Relative Validation Time
Across 10 repeated runs, 95% of timings were within +/-4.61% of their 10-run mean, with a median drift of 0.96%. Like any microbenchmark, background CPU activity can affect individual measurements. Values are time ratios from the Performance Summary table.
Figure 3. Dot Inline vs. Cached Validators
Comparisons are size for size: each point divides a validator's cached time by dot's inline time for the same schema. Values above 1x mean dot constructs and validates faster than the validator's cached schema.
Detailed Performance Results
dot
| test | mode | avg time | ops/sec | avg mem |
|---|---|---|---|---|
| small | cached | 54.41 ns | 18,378,893 | 144.36 B |
| small | inline | 104.37 ns | 9,581,608 | 1.39 KB |
| plain | cached | 1.44 μs | 694,235 | 870.13 B |
| plain | inline | 1.61 μs | 620,158 | 1.35 KB |
| medium | cached | 1.02 μs | 979,946 | 904.98 B |
| medium | inline | 1.60 μs | 624,866 | 10.96 KB |
| large | cached | 11.70 μs | 85,504 | 5.71 KB |
| large | inline | 12.51 μs | 79,938 | 21.70 KB |
| xlarge | cached | 30.01 μs | 33,327 | 9.36 KB |
| xlarge | inline | 32.86 μs | 30,433 | 48.14 KB |
| huge | cached | 53.89 μs | 18,557 | 18.54 KB |
| huge | inline | 62.90 μs | 15,899 | 132.58 KB |
zod v4
| test | mode | avg time | ops/sec | avg mem |
|---|---|---|---|---|
| small | cached | 124.05 ns | 8,061,426 | 738.05 B |
| small | inline | 41.25 μs | 24,245 | 161.59 KB |
| plain | cached | 2.35 μs | 424,732 | 3.14 KB |
| plain | inline | 159.68 μs | 6,263 | 659.95 KB |
| medium | cached | 1.68 μs | 595,984 | 473.07 B |
| medium | inline | 290.06 μs | 3,448 | 983.40 KB |
| large | cached | 18.38 μs | 54,403 | 131.83 KB |
| large | inline | 487.99 μs | 2,049 | 1.73 MB |
| xlarge | cached | 63.66 μs | 15,708 | 370.47 KB |
| xlarge | inline | 1.20 ms | 836 | 4.19 MB |
| huge | cached | 118.12 μs | 8,466 | 558.04 KB |
| huge | inline | 3.60 ms | 277 | 12.24 MB |
zod v4 medium-cached memory number seems implausible
zod v3
| test | mode | avg time | ops/sec | avg mem |
|---|---|---|---|---|
| small | cached | 183.31 ns | 5,455,357 | 1.31 KB |
| small | inline | 3.90 μs | 256,712 | 19.42 KB |
| plain | cached | 4.90 μs | 204,162 | 39.44 KB |
| plain | inline | 18.41 μs | 54,327 | 103.39 KB |
| medium | cached | 2.97 μs | 336,988 | 5.79 KB |
| medium | inline | 39.82 μs | 25,114 | 137.44 KB |
| large | cached | 30.22 μs | 33,095 | 229.34 KB |
| large | inline | 87.58 μs | 11,418 | 413.52 KB |
| xlarge | cached | 98.51 μs | 10,151 | 643.93 KB |
| xlarge | inline | 240.09 μs | 4,165 | 1.06 MB |
| huge | cached | 167.34 μs | 5,976 | 1.06 MB |
| huge | inline | 575.61 μs | 1,737 | 2.36 MB |
zod/mini
| test | mode | avg time | ops/sec | avg mem |
|---|---|---|---|---|
| small | cached | 226.39 ns | 4,417,206 | 1.10 KB |
| small | inline | 12.61 μs | 79,313 | 37.92 KB |
| plain | cached | 3.15 μs | 317,334 | 1.84 KB |
| plain | inline | 56.60 μs | 17,669 | 190.19 KB |
| medium | cached | 2.89 μs | 346,362 | 2.52 KB |
| medium | inline | 123.70 μs | 8,084 | 296.64 KB |
| large | cached | 22.05 μs | 45,343 | 137.75 KB |
| large | inline | 192.47 μs | 5,196 | 568.59 KB |
| xlarge | cached | 74.70 μs | 13,386 | 386.27 KB |
| xlarge | inline | 521.67 μs | 1,917 | 1.42 MB |
| huge | cached | 154.84 μs | 6,458 | 612.46 KB |
| huge | inline | 1.52 ms | 657 | 3.76 MB |
yup
| test | mode | avg time | ops/sec | avg mem |
|---|---|---|---|---|
| small | cached | 1.78 μs | 560,755 | 1.24 KB |
| small | inline | 8.04 μs | 124,345 | 51.92 KB |
| plain | cached | 76.34 μs | 13,099 | 565.19 KB |
| plain | inline | 115.17 μs | 8,683 | 733.38 KB |
| medium | cached | 19.95 μs | 50,134 | 129.92 KB |
| medium | inline | 69.90 μs | 14,305 | 348.02 KB |
| large | cached | 561.20 μs | 1,782 | 3.97 MB |
| large | inline | 659.30 μs | 1,517 | 4.34 MB |
| xlarge | cached | 1.67 ms | 599 | 10.64 MB |
| xlarge | inline | 2.06 ms | 486 | 11.66 MB |
| huge | cached | 2.12 ms | 471 | 13.26 MB |
| huge | inline | 3.12 ms | 321 | 15.90 MB |
joi
| test | mode | avg time | ops/sec | avg mem |
|---|---|---|---|---|
| small | cached | 489.29 ns | 2,043,773 | 1.91 KB |
| small | inline | 11.24 μs | 88,949 | 52.81 KB |
| plain | cached | 21.91 μs | 45,649 | 171.27 KB |
| plain | inline | 93.01 μs | 10,752 | 471.38 KB |
| medium | cached | 9.11 μs | 109,715 | 39.50 KB |
| medium | inline | 101.00 μs | 9,901 | 395.04 KB |
| large | cached | 142.12 μs | 7,036 | 1.19 MB |
| large | inline | 311.09 μs | 3,215 | 1.84 MB |
| xlarge | cached | 420.04 μs | 2,381 | 3.26 MB |
| xlarge | inline | 900.75 μs | 1,110 | 5.04 MB |
| huge | cached | 649.69 μs | 1,539 | 4.21 MB |
| huge | inline | 2.29 ms | 437 | 9.85 MB |
superstruct
| test | mode | avg time | ops/sec | avg mem |
|---|---|---|---|---|
| small | cached | 1.36 μs | 733,354 | 682.22 B |
| small | inline | 5.00 μs | 200,181 | 6.04 KB |
| plain | cached | 48.26 μs | 20,720 | 345.76 KB |
| plain | inline | 64.39 μs | 15,530 | 384.19 KB |
| medium | cached | 29.79 μs | 33,571 | 121.10 KB |
| medium | inline | 59.42 μs | 16,830 | 183.88 KB |
| large | cached | 249.93 μs | 4,001 | 2.33 MB |
| large | inline | 295.17 μs | 3,388 | 2.43 MB |
| xlarge | cached | 734.73 μs | 1,361 | 6.38 MB |
| xlarge | inline | 873.20 μs | 1,145 | 6.65 MB |
| huge | cached | 1.52 ms | 659 | 8.97 MB |
| huge | inline | 1.90 ms | 527 | 9.69 MB |
runtypes
| test | mode | avg time | ops/sec | avg mem |
|---|---|---|---|---|
| small | cached | 1.38 μs | 722,371 | 1.12 KB |
| small | inline | 53.48 μs | 18,700 | 85.05 KB |
| plain | cached | 22.79 μs | 43,870 | 89.67 KB |
| plain | inline | 279.60 μs | 3,577 | 459.09 KB |
| medium | cached | 23.26 μs | 42,994 | 56.30 KB |
| medium | inline | 501.03 μs | 1,996 | 777.40 KB |
| large | cached | 136.67 μs | 7,317 | 576.77 KB |
| large | inline | 908.30 μs | 1,101 | 1.66 MB |
| xlarge | cached | 528.15 μs | 1,893 | 1.85 MB |
| xlarge | inline | 3.17 ms | 315 | 5.62 MB |
| huge | cached | 1.72 ms | 580 | 4.13 MB |
| huge | inline | 9.31 ms | 107 | 14.52 MB |
valibot
| test | mode | avg time | ops/sec | avg mem |
|---|---|---|---|---|
| small | cached | 170.75 ns | 5,856,443 | 344.80 B |
| small | inline | 3.26 μs | 307,016 | 2.75 KB |
| plain | cached | 2.93 μs | 341,107 | 3.19 KB |
| plain | inline | 13.18 μs | 75,897 | 6.53 KB |
| medium | cached | 1.71 μs | 585,419 | 648.49 B |
| medium | inline | 29.22 μs | 34,227 | 55.71 KB |
| large | cached | 18.97 μs | 52,712 | 30.36 B |
| large | inline | 60.89 μs | 16,422 | 186.84 KB |
| xlarge | cached | 53.48 μs | 18,700 | 285.10 KB |
| xlarge | inline | 158.93 μs | 6,292 | 480.91 KB |
| huge | cached | 111.29 μs | 8,985 | 397.69 KB |
| huge | inline | 435.71 μs | 2,295 | 994.23 KB |
Summary (relative to dot)
| lib | test | mode | time | memory |
|---|---|---|---|---|
| zod v4 | small | cached | 2.28x slower | 5.11x more |
| zod v4 | small | inline | 395.2x slower | 116.3x more |
| zod v4 | plain | cached | 1.63x slower | 3.70x more |
| zod v4 | plain | inline | 99.0x slower | 487.1x more |
| zod v4 | medium | cached | 1.64x slower | 1.91x less |
| zod v4 | medium | inline | 181.2x slower | 89.7x more |
| zod v4 | large | cached | 1.57x slower | 23.1x more |
| zod v4 | large | inline | 39.0x slower | 81.4x more |
| zod v4 | xlarge | cached | 2.12x slower | 39.6x more |
| zod v4 | xlarge | inline | 36.4x slower | 89.1x more |
| zod v4 | huge | cached | 2.19x slower | 30.1x more |
| zod v4 | huge | inline | 57.3x slower | 94.6x more |
| zod v3 | small | cached | 3.37x slower | 9.28x more |
| zod v3 | small | inline | 37.3x slower | 14.0x more |
| zod v3 | plain | cached | 3.40x slower | 46.4x more |
| zod v3 | plain | inline | 11.4x slower | 76.3x more |
| zod v3 | medium | cached | 2.91x slower | 6.55x more |
| zod v3 | medium | inline | 24.9x slower | 12.5x more |
| zod v3 | large | cached | 2.58x slower | 40.2x more |
| zod v3 | large | inline | 7.00x slower | 19.1x more |
| zod v3 | xlarge | cached | 3.28x slower | 68.8x more |
| zod v3 | xlarge | inline | 7.31x slower | 22.6x more |
| zod v3 | huge | cached | 3.11x slower | 58.6x more |
| zod v3 | huge | inline | 9.15x slower | 18.2x more |
| zod/mini | small | cached | 4.16x slower | 7.78x more |
| zod/mini | small | inline | 120.8x slower | 27.3x more |
| zod/mini | plain | cached | 2.19x slower | 2.17x more |
| zod/mini | plain | inline | 35.1x slower | 140.4x more |
| zod/mini | medium | cached | 2.83x slower | 2.85x more |
| zod/mini | medium | inline | 77.3x slower | 27.1x more |
| zod/mini | large | cached | 1.89x slower | 24.1x more |
| zod/mini | large | inline | 15.4x slower | 26.2x more |
| zod/mini | xlarge | cached | 2.49x slower | 41.3x more |
| zod/mini | xlarge | inline | 15.9x slower | 30.3x more |
| zod/mini | huge | cached | 2.87x slower | 33.0x more |
| zod/mini | huge | inline | 24.2x slower | 29.0x more |
| yup | small | cached | 32.8x slower | 8.80x more |
| yup | small | inline | 77.1x slower | 37.4x more |
| yup | plain | cached | 53.0x slower | 665.1x more |
| yup | plain | inline | 71.4x slower | 541.3x more |
| yup | medium | cached | 19.5x slower | 147.0x more |
| yup | medium | inline | 43.7x slower | 31.7x more |
| yup | large | cached | 48.0x slower | 711.1x more |
| yup | large | inline | 52.7x slower | 205.0x more |
| yup | xlarge | cached | 55.6x slower | 1163.9x more |
| yup | xlarge | inline | 62.6x slower | 248.0x more |
| yup | huge | cached | 39.4x slower | 732.2x more |
| yup | huge | inline | 49.6x slower | 122.8x more |
| joi | small | cached | 8.99x slower | 13.6x more |
| joi | small | inline | 107.7x slower | 38.0x more |
| joi | plain | cached | 15.2x slower | 201.6x more |
| joi | plain | inline | 57.7x slower | 347.9x more |
| joi | medium | cached | 8.93x slower | 44.7x more |
| joi | medium | inline | 63.1x slower | 36.0x more |
| joi | large | cached | 12.2x slower | 212.8x more |
| joi | large | inline | 24.9x slower | 86.8x more |
| joi | xlarge | cached | 14.0x slower | 357.0x more |
| joi | xlarge | inline | 27.4x slower | 107.1x more |
| joi | huge | cached | 12.1x slower | 232.6x more |
| joi | huge | inline | 36.4x slower | 76.0x more |
| superstruct | small | cached | 25.1x slower | 4.73x more |
| superstruct | small | inline | 47.9x slower | 4.35x more |
| superstruct | plain | cached | 33.5x slower | 406.9x more |
| superstruct | plain | inline | 39.9x slower | 283.5x more |
| superstruct | medium | cached | 29.2x slower | 137.0x more |
| superstruct | medium | inline | 37.1x slower | 16.8x more |
| superstruct | large | cached | 21.4x slower | 418.2x more |
| superstruct | large | inline | 23.6x slower | 114.6x more |
| superstruct | xlarge | cached | 24.5x slower | 697.5x more |
| superstruct | xlarge | inline | 26.6x slower | 141.3x more |
| superstruct | huge | cached | 28.2x slower | 495.3x more |
| superstruct | huge | inline | 30.1x slower | 74.8x more |
| runtypes | small | cached | 25.4x slower | 7.93x more |
| runtypes | small | inline | 512.4x slower | 61.2x more |
| runtypes | plain | cached | 15.8x slower | 105.5x more |
| runtypes | plain | inline | 173.4x slower | 338.8x more |
| runtypes | medium | cached | 22.8x slower | 63.7x more |
| runtypes | medium | inline | 313.1x slower | 70.9x more |
| runtypes | large | cached | 11.7x slower | 101.0x more |
| runtypes | large | inline | 72.6x slower | 78.6x more |
| runtypes | xlarge | cached | 17.6x slower | 202.3x more |
| runtypes | xlarge | inline | 96.5x slower | 119.4x more |
| runtypes | huge | cached | 32.0x slower | 228.3x more |
| runtypes | huge | inline | 148.0x slower | 112.1x more |
| valibot | small | cached | 3.14x slower | 2.39x more |
| valibot | small | inline | 31.2x slower | 1.98x more |
| valibot | plain | cached | 2.04x slower | 3.76x more |
| valibot | plain | inline | 8.17x slower | 4.82x more |
| valibot | medium | cached | 1.67x slower | 1.40x less |
| valibot | medium | inline | 18.3x slower | 5.08x more |
| valibot | large | cached | 1.62x slower | 192.6x less |
| valibot | large | inline | 4.87x slower | 8.61x more |
| valibot | xlarge | cached | 1.78x slower | 30.5x more |
| valibot | xlarge | inline | 4.84x slower | 9.99x more |
| valibot | huge | cached | 2.07x slower | 21.4x more |
| valibot | huge | inline | 6.93x slower | 7.50x more |
zod v4 medium-cached and valibot large-cached memory numbers seem implausible
