我一直在测试在rust中创建和初始化2d矩阵的最快方法。
Methods I tried (Initialize 1000x1000 2d array):
Array2::<i32>::zeros((width, height))
(使用ndarray包)vec![vec![0; height]; width]
[[u32; width]; height] = [[0; width]; height]
因为在底层它分配的是一个一维向量。试试这个:
vec![0; width * height]
由于不需要初始化,可以非常快速地创建零初始化的数值类型向量。但是,第二个方法分配width + 1
向量,并且需要初始化外部容器。这不仅在内存消耗方面造成不必要的浪费,而且可能导致数据局部性差和可能的堆碎片,因为没有什么要求内部向量的堆分配彼此靠近。这里的性能损失几乎肯定是由于必须执行1,000个额外的堆分配。
第三个方法创建一个数组的数组。这种方法连续地布局数据,因此比第二种方法更好,但是Rust不能像从堆中分配时那样跳过初始化步骤,因此需要更长的时间。