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)?
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.