Benchmarks
Performance comparisons vs Zod and Pydantic.
Benchmarks
Rod prioritizes consistency and portability. Here is how it stacks up against native incumbents in various environments.
Simple Object
Validating a basic user: { name: "John", age: 30 }.
| Environment | Library | Time (ns) | Relative Speed |
|---|---|---|---|
| JS | Zod | 201 ns | 1.0x (Fastest) |
| Python | Pydantic | 591 ns | 2.9x slower |
| Rust | Rod (Native) | 217 ns | 1.1x slower |
| JS/WASM | Rod (Lazy) | 2,001 ns | 10x slower |
| Python | Rod (PyO3) | 4,510 ns | 22x slower |
Batch Processing (10k items)
Validating a massive array of integers.
| Environment | API | Time (ms) |
|---|---|---|
| Rust | Rod Native | 0.11 ms |
| JS | Zod | 0.43 ms |
| JS/WASM | Rod (checkBatch) | 0.27 ms |
| Python | Pydantic | 0.08 ms |
| Python | Rod (PyO3) | 2.99 ms |
Benchmark Scenarios
// Criterion benchmark
let schema = rod_obj! {
name: string(),
age: number()
};
let data = json!({ "name": "John", "age": 30 });
let input = wrap(&data);
b.iter(|| schema.validate(&input));// Mitata benchmark
const schema = rod.object({
name: rod.string(),
age: rod.number()
});
const data = { name: "John", age: 30 };
bench('rod', () => schema.parse(data));# Timeit benchmark
schema = rod.object({
"name": rod.string(),
"age": rod.number()
})
data = {"name": "John", "age": 30}
timeit.timeit(lambda: schema.parse(data))