创建2d数组的最快方式



我一直在测试在rust中创建和初始化2d矩阵的最快方法。

Methods I tried (Initialize 1000x1000 2d array):

<表类> 方法时间tbody><<tr>Array2::<i32>::zeros((width, height))(使用ndarray包)47μsvec![vec![0; height]; width]8.0649ms[[u32; width]; height] = [[0; width]; height]301.4µs

因为在底层它分配的是一个一维向量。试试这个:

vec![0; width * height]

由于不需要初始化,可以非常快速地创建零初始化的数值类型向量。但是,第二个方法分配width + 1向量,并且需要初始化外部容器。这不仅在内存消耗方面造成不必要的浪费,而且可能导致数据局部性差和可能的堆碎片,因为没有什么要求内部向量的堆分配彼此靠近。这里的性能损失几乎肯定是由于必须执行1,000个额外的堆分配。

第三个方法创建一个数组的数组。这种方法连续地布局数据,因此比第二种方法更好,但是Rust不能像从堆中分配时那样跳过初始化步骤,因此需要更长的时间。

最新更新