# micro_ndarray Most likely the smallest ndarray rust implementation with the best feature/size ratio you will find. Did you know `micro_ndarray` is almost exactly 100x smaller than `ndarray` and has no dependencies (except for std)? ## Benchmarks Both implementations are extremely fast considering the number of elements each iteration of the benchmark goes through: 10_000_000 relatively equally distributed across the dimensions of the arrays. However, this changes in 7D, as ndarray only has a man-made fast implementation for up to 7D, while micro_ndarray relies on a single implementation for all dimensions. This makes it slower in smaller dimensions, but much, much faster in higher dimensions. micro_ndarray only has few dimension-dependent optimizations and only for 1D, 2D, and 3D. All benchmarks were run on: ``` CPU: Intel i5-2400 (4) @ 3.400GHz Memory: 15939MiB ``` In short: ``` micro_ndarray time: [24.460 ms 24.602 ms 24.777 ms] ndarray time: [6.2882 ms 6.3008 ms 6.3148 ms] micro_ndarray 3D time: [43.007 ms 43.054 ms 43.101 ms] ndarray 3D time: [25.750 ms 25.778 ms 25.806 ms] micro_ndarray 4D time: [47.875 ms 47.958 ms 48.043 ms] ndarray 4D time: [39.701 ms 39.756 ms 39.810 ms] micro_ndarray 7D time: [46.657 ms 46.724 ms 46.790 ms] ndarray 7D time: [1.6210 s 1.6228 s 1.6247 s] <- Boom ``` In order by speed: ``` ndarray time: [6.2882 ms 6.3008 ms 6.3148 ms] ... micro_ndarray time: [24.460 ms 24.602 ms 24.777 ms] ndarray 3D time: [25.750 ms 25.778 ms 25.806 ms] ndarray 4D time: [39.701 ms 39.756 ms 39.810 ms] micro_ndarray 3D time: [43.007 ms 43.054 ms 43.101 ms] micro_ndarray 7D time: [46.657 ms 46.724 ms 46.790 ms] <-\ the difference here is most likely noise micro_ndarray 4D time: [47.875 ms 47.958 ms 48.043 ms] <-/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ... ... [some more ...] ... ... ndarray 7D time: [1.6210 s 1.6228 s 1.6247 s] <- Boom ``` In long: ``` Running benches/benchmarks.rs (target/release/deps/benchmarks-37dfbc027b120770) micro_ndarray time: [24.460 ms 24.602 ms 24.777 ms] change: [+0.8630% +1.4891% +2.2669%] (p = 0.00 < 0.05) Change within noise threshold. Found 8 outliers among 100 measurements (8.00%) 4 (4.00%) high mild 4 (4.00%) high severe ndarray time: [6.2882 ms 6.3008 ms 6.3148 ms] change: [-0.7727% -0.5346% -0.2994%] (p = 0.00 < 0.05) Change within noise threshold. Found 3 outliers among 100 measurements (3.00%) 2 (2.00%) high mild 1 (1.00%) high severe micro_ndarray 3D time: [43.007 ms 43.054 ms 43.101 ms] change: [-1.1832% -1.0392% -0.8876%] (p = 0.00 < 0.05) Change within noise threshold. ndarray 3D time: [25.750 ms 25.778 ms 25.806 ms] change: [-0.6465% -0.5203% -0.3904%] (p = 0.00 < 0.05) Change within noise threshold. micro_ndarray 4D time: [47.875 ms 47.958 ms 48.043 ms] change: [-0.3193% -0.1150% +0.0840%] (p = 0.27 > 0.05) No change in performance detected. Found 2 outliers among 100 measurements (2.00%) 2 (2.00%) high mild ndarray 4D time: [39.701 ms 39.756 ms 39.810 ms] change: [-0.7251% -0.5708% -0.4248%] (p = 0.00 < 0.05) Change within noise threshold. micro_ndarray 7D time: [46.657 ms 46.724 ms 46.790 ms] change: [-0.3268% -0.1459% +0.0485%] (p = 0.14 > 0.05) No change in performance detected. Benchmarking ndarray 7D: Warming up for 3.0000 s Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 170.6s, or reduce sample count to 10. ndarray 7D time: [1.6210 s 1.6228 s 1.6247 s] change: [+0.4095% +1.6176% +2.8514%] (p = 0.01 < 0.05) Change within noise threshold. Found 2 outliers among 100 measurements (2.00%) 2 (2.00%) high mild ``` As you can see, micro_ndarray is very consistent even with higher dimensions, while ndarray is extremely fast in 2D and exteremely slow in 7D.