Download benchmark report
Full benchmark results with 74 decision scenarios
Benchmark highlights
| Scenario | Throughput |
|---|---|
| Realtime fraud detection | 191K req/s |
| Dynamic FX rate pricing | 184K req/s |
| Insurance agent commission | 148K req/s |
| Loan approval | 45K req/s |
| Company analysis (complex) | 4K req/s |
Language binding performance
All bindings share the same Rust core. The binding layer adds minimal overhead for most languages.| Language | Binding | Overhead | Notes |
|---|---|---|---|
| Rust | Native | None | Baseline performance |
| Node.js | NAPI-RS | Low | Near-native, minimal serialization overhead |
| Python | PyO3 | Low | Efficient type conversions, async support |
| Go | Custom C + CGO | Low | CGO boundary overhead, native evaluation |
| WebAssembly | WASM + NAPI | Low | Browser and edge deployments |
| Swift | UniFFI | Low | Idiomatic Swift APIs |
| Kotlin/Java/Android | JNA (UniFFI) | High | JVM boundary and object marshalling overhead |
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.