C++ - 静态数组的性能,启动时大小可变

C++ - Performance of static arrays, with variable size at launch

我编写了一个元胞自动机程序,将数据存储在矩阵(数组的数组)中。对于 300*200 矩阵,我可以使用静态内存分配实现每秒 60 次或更多次迭代(例如 std::array)。

我想生成不同大小的矩阵而不用每次都重新编译程序,即用户输入一个大小,然后开始模拟该矩阵大小。但是,如果我使用动态内存分配(例如 std::vector),模拟会下降到每秒约 2 次迭代。我怎么解决这个问题?我采用的一种选择是预先分配一个大于我预期用户 select(例如 2000*2000)的静态数组,但这似乎很浪费,并且在某种程度上仍然限制了用户的选择。

我想知道我是否可以

a) 分配一次内存然后以某种方式"freeze" 它用于普通静态数组性能?

b) 或对 std::vector 执行更高效的操作?作为参考,我只对矩阵执行 matrix[x][y] == 1matrix[x][y] = 1 操作。

根据this question/answerstd::vector或使用指针在性能上没有区别。

编辑:

我已经按照 UmNyobe 的建议重写了矩阵,使其成为单个数组,可通过 matrix[y*size_x + x] 访问。使用动态内存分配(在启动时调整大小),我将性能提高了一倍,达到每秒 5 次迭代。

根据 PaulMcKenzie 的评论,我编译了一个发布版本并获得了我想要的性能(每秒 60 次或更多次迭代)。然而,这是更多的基础,所以我还是想更彻底地量化一种方法相对于另一种方法的好处,所以我用一个std::chrono::high_resolution_clock来计时每次迭代,发现动态和静态的性能差异数组(在使用单个数组矩阵表示之后)在误差范围内(每次迭代 450~600 微秒)。

然而,调试期间的性能是一个小问题,所以我想我会保留两者,并在调试时切换到静态数组。

For reference, I am only performing

matrix[x][y]
  • 红旗!你的矩阵使用vector<vector<int>>吗 表示?这是一个错误,因为矩阵的行会很远 在记忆中分开。您应该使用大小为 rows x cols 的单个向量 并使用 matrix[y * row + x]
  • 此外,您应该遵循先按行索引然后按列索引的方法,即 matrix[y][x] 而不是 matrix[x][y]。您的算法也应该以相同的方式处理。这是因为 matrix[y][x] (x, y) 和 (x + 1, y) 是彼此的一个内存块,而任何其他机制元素 (x,y)(x + 1, y) , (x, y + 1) 更远.

即使性能从 std::array 下降到 std::vector(因为数组可以将其元素放在堆栈上,这样速度更快),一个体面的算法将执行相同的数量级使用两个系列。