Download benchmark report
Full benchmark results with 74 decision scenarios
Benchmark highlights
Performance varies based on decision structure. Pure decision tables and expression nodes achieve 150K+ evaluations per second. Decisions using Function nodes run slower (3-50K req/s) due to JavaScript runtime overhead.
Language binding performance
All bindings share the same Rust core. The binding layer adds minimal overhead for most languages.Performance optimization tips
Pre-compile decisions. UseZenDecisionContent to parse and compile decisions once, then reuse them for multiple evaluations. This is available in Node.js, Python, and Go SDKs.
Reuse engine instances. Create a single engine at startup rather than instantiating per-request. Engine creation has initialization costs.
Batch evaluations when possible. If you’re evaluating the same decision with many inputs, batch them to amortize any per-call overhead.
Profile your specific decisions. Performance varies significantly based on decision complexity. A simple lookup table runs 50x faster than a complex multi-stage graph with custom functions.
Benchmark methodology
All benchmarks were run on a MacBook Pro with Apple M3 chip using single-core execution. Each scenario represents a real-world business rule pattern:- Decision tables only (100K+ req/s): Pure table lookups and expressions
- Mixed graphs (50-100K req/s): Multiple nodes, branching logic
- Function-heavy (3-50K req/s): Decisions using Function nodes with JavaScript execution
The slowest benchmarks (Company analysis, Insurance breakdown, AML) use Function nodes extensively. If you need maximum throughput, prefer decision tables and expression nodes over custom JavaScript functions.