Idiomatic exceptions for Rust
Speed up the happy path of your Result-based functions by seamlessly using exceptions for error
propagation.
Crash course
Stick #[iex] on all the functions that return Result to make them return an efficiently
propagatable #[iex] Result, apply ? just like usual, and occasionally call .into_result()
when you need a real Result. It's that intuitive.
Compared to an algebraic Result, #[iex] Result is asymmetric: it sacrifices the performance of
error handling, and in return:
- Gets rid of branching in the happy path,
- Reduces memory usage by never explicitly storing the error or the enum discriminant,
- Enables the compiler to use registers instead of memory when wrapping small objects in
Ok, - Cleanly separates the happy and unhappy paths in the machine code, resulting in better instruction locality.
Benchmark
As a demonstration, we have rewritten serde and serde_json to use #[iex] in the
deserialization path and used the Rust JSON Benchmark to compare performance. These are the
results:
The data is averaged between 5 runs. The repositories for data reproduction are published on GitHub.
Example
use ;