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: 10000000 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 microndarray relies on a single implementation for all dimensions. This makes it slower in smaller dimensions, but much, much faster in higher dimensions. microndarray 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.