Arithmetic Nonmax
The arithmetic-nonmax crate provides NonMax* types for integer types that are guaranteed to never be their maximum value (MAX). Using NonMax* types enables memory layout optimization.
Additionally, arithmetic operations can be written intuitively as shown below. For example, in shortest path algorithms, using the Option<NonMax*> type allows you to leverage the type system while optimizing the memory layout. See Benchmarks for more details.
Usage
use NonMaxU32;
let a: NonMaxU32 = new.unwrap;
let b = new.unwrap;
let c = a + b; // Arithmetic operations between NonMaxU32 types
assert!;
let d = a * 5; // Arithmetic operations with primitive integers
assert_eq!; // Can be converted to string
Memory Optimization
You can verify the memory layout optimization as follows:
use *;
// Check byte size for u32
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
// Check byte size for Option<NonMax*>
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
Benchmarks
Benchmarks are available in benches/comparison.rs. They compare execution time and memory usage between using and not using NonMax types.
| Algorithm | With NonMax |
Without NonMax |
|---|---|---|
| Dijkstra ($V=5.0 \times 105, E = 5.0 \times 106$) | 450ms / 18.8MB | 505ms / 20.8MB |
| Floyd-Warshall ($V=5.0 \times 102, E = 5.0 \times 103$) | 103ms / 1.00MB | 112ms / 2.00MB |