@sthir/runtime-checker vs zod: partial parsing (bailing after 10 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 errors = function* (x, n) {
  for (let y of t.array(t.record(t.string, t.string))(x)) {
    if (y?.type === "error") { yield y.value; n-- }
    if (n === 0) return
  }
}

;[...errors(window.input, 10)]
ready
zod
const z = window.z
const errors = (x, n) =>
 (z.array(z.record(z.string(), z.string())).safeParse(x)?.error?.errors ?? []).slice(0, n)

errors(window.input, 10)
ready

Revisions

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