LogoLogo

Schema Benchmarks

    • home
      Home

    • download_2
      Download

    • timer
      Initialization
    • check_circle
      Validation
    • output_circle
      Parsing
    • swap_horiz
      Codec
    • schema
      Standard Schema
    • format_quote
      String

    • error
      Stack

    • article
      Blog
Code styleCode style
Normal styleNormal style
System themeSystem theme
Light themeLight theme
Dark themeDark theme
Expand sidebarExpand sidebar
Benchmarks/ParsingParsing
Code styleCode style
Normal styleNormal style
System themeSystem theme
Light themeLight theme
Dark themeDark theme
github
GitHubGitHub
DiscordDiscord

Parsing a value to match the schema. This is different to validation because it returns a new value.

Copy to clipboardCopy to clipboard
import * as v from "valibot"; import { personSchema } from "./schemas"; const person = v.parse(personSchema, data); // person is of type Person
Data
errorInvalidcheck_circleValid
Optimizations
flash_offNonecodeJITbuildPrecompiled
Abort early
errorAll errorswarningAbort early
LibrarysortVersionDownloads (/wk)sortOptimizationsError typeMeanarrow_upwardCompare
@railway-ts/pipelines
Code snippetCode snippet
validate(data, schema, { abortEarly: true })
0.1.2734NoneAbort early643 ns
valibot
Code snippetCode snippet
v.safeParse(schema, data, { abortEarly: true })
1.3.17.93MNoneAbort early701 ns
1.09x
stat_minus_1
effect@beta
Code snippetCode snippet
// const decode = Schema.decodeUnknownOption(schema);
decode(data, { errors: "first" })

(Commented code is not benchmarked)

4.0.0-beta.469.44MNoneAbort early1 μs
1.83x
stat_minus_1
joi
Code snippetCode snippet
schema.validate(data, { abortEarly: true })
18.1.218.74MNoneAbort early4 μs
6.28x
stat_minus_1
io-ts
Code snippetCode snippet
schema.decode(data)
2.2.222.92MNoneAll errors6 μs
9.54x
stat_minus_1
effect
Code snippetCode snippet
// const decodeFirst = Schema.decodeUnknownEither(
//  schema, 
//  { errors: "first" }
// );
decodeFirst(data)

(Commented code is not benchmarked)

3.21.09.44MNoneAbort early9 μs
14.67x
stat_minus_1
superstruct
Code snippetCode snippet
validate(data, schema)
2.0.24.02MNoneAbort early10 μs
15.36x
stat_minus_1
superstruct (schema.validate)
Code snippetCode snippet
schema.validate(data)
2.0.24.02MNoneAbort early10 μs
15.76x
stat_minus_1
effect@beta
Code snippetCode snippet
// const decode = Schema.decodeUnknownOption(schema);
decode(data, { errors: "all" })

(Commented code is not benchmarked)

4.0.0-beta.469.44MNoneAll errors22 μs
33.6x
stat_minus_1
valibot
Code snippetCode snippet
v.safeParse(schema, data)
1.3.17.93MNoneAll errors27 μs
41.82x
stat_minus_1
valibot (abortPipeEarly only)
Code snippetCode snippet
v.safeParse(schema, data, { abortPipeEarly: true })
1.3.17.93MNoneAbort early28 μs
42.92x
stat_minus_1
@railway-ts/pipelines
Code snippetCode snippet
validate(data, schema)
0.1.2734NoneAll errors29 μs
45.24x
stat_minus_1
effect
Code snippetCode snippet
// const decodeAll = Schema.decodeUnknownEither(
//  schema, 
//  { errors: "all" }
// );
decodeAll(data)

(Commented code is not benchmarked)

3.21.09.44MNoneAll errors31 μs
47.9x
stat_minus_1
zod/v3
Code snippetCode snippet
schema.safeParse(data)
4.3.6151.14MNoneAll errors37 μs
57.88x
stat_minus_1
joi
Code snippetCode snippet
schema.validate(data, { abortEarly: false })
18.1.218.74MNoneAll errors55 μs
85.51x
stat_minus_1
zod/mini (jitless)
Code snippetCode snippet
schema.safeParse(data, { jitless: true })
4.3.6151.14MNoneAll errors64 μs
99.11x
stat_minus_1
decoders
Code snippetCode snippet
schema.decode(data)
2.9.338.55KNoneAll errors74 μs
114.32x
stat_minus_1
superstruct
Code snippetCode snippet
const [error] = validate(data, schema);
for (const failure of error.failures()) {
  // ...
}
2.0.24.02MNoneAll errors74 μs
115.07x
stat_minus_1
superstruct
Code snippetCode snippet
const [error] = schema.validate(data);
for (const failure of error.failures()) {
  // ...
}
2.0.24.02MNoneAll errors75 μs
115.94x
stat_minus_1
zod (jitless)
Code snippetCode snippet
schema.safeParse(data, { jitless: true })
4.3.6151.14MNoneAll errors78 μs
121.87x
stat_minus_1
yup
Code snippetCode snippet
schema.validateSync(data, { abortEarly: true })
Throws on invalid dataThrows on invalid data
This library throws an error when parsing invalid data (and has no non-throwing equivalent), so the benchmark includes a try/catch.
1.7.110.79MNoneAbort early85 μs
132.05x
stat_minus_1
runtypes
Code snippetCode snippet
schema.inspect(data)
7.0.4279.42KNoneAbort early182 μs
282.85x
stat_minus_2
runtypes
Code snippetCode snippet
schema.parse(data)
Throws on invalid dataThrows on invalid data
This library throws an error when parsing invalid data (and has no non-throwing equivalent), so the benchmark includes a try/catch.
7.0.4279.42KNoneAbort early185 μs
287.99x
stat_minus_2
@sapphire/shapeshift
Code snippetCode snippet
schema.parse(data)
Throws on invalid dataThrows on invalid data
This library throws an error when parsing invalid data (and has no non-throwing equivalent), so the benchmark includes a try/catch.
4.0.0629.44KNoneAll errors260 μs
404.3x
stat_minus_2
@sapphire/shapeshift (run)
Code snippetCode snippet
schema.run(data)
4.0.0629.44KNoneAll errors262 μs
407.37x
stat_minus_2
yup
Code snippetCode snippet
schema.validateSync(data, { abortEarly: false })
Throws on invalid dataThrows on invalid data
This library throws an error when parsing invalid data (and has no non-throwing equivalent), so the benchmark includes a try/catch.
1.7.110.79MNoneAll errors480 μs
746.27x
stat_minus_3
Created by eskimojo for Open Circle