@sthir/runtime-checker vs zod: validation (bailing after 1 error)

Benchmark created on


Setup

window.t = get("https://unpkg.com/@sthir/runtime-checker/dist/sthir-runtime-checker.cjs.prod.js")
window.z = get("https://unpkg.com/zod/lib/index.umd.js")
window.input = Array.from({ length: 500 }, () => seed(Object))

function seed(t) {
  if (t === Number) return Math.floor(Math.random() * 10)
  if (t === String) return (Math.random() + 1).toString(36).slice(2)
  if (t === Object) {
    return Object.fromEntries(
      Array.from(
        { length: seed(Number) },
        () => [seed(String), seed(Number) > 5 ? seed(String) : seed(Number)]
      )
    )
  }
  throw new Error("invariant: unreachable")
}

function get(url) {
  let req = new XMLHttpRequest(); req.open("GET", url, false); req.send()
  return new Function("let module = { exports: {} };\nlet exports = module.exports;\n" + req.response + ";\nreturn module.exports")()
}

Test runner

Ready to run.

Testing in
TestOps/sec
@sthir/runtime-checker
const t = window.t
const isValid = a =>
  t.is(a, t.array(t.record(t.string, t.string)))

isValid(window.input)
ready
zod
const z = window.z
const isValid = a =>
 z.array(z.record(z.string(), z.string())).safeParse(a).success

isValid(window.input)
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.