1

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

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

我想知道我是否可以

a)分配一次内存,然后以某种方式“冻结”它以获得普通的静态数组性能?

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 微秒)。

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

4

1 回答 1

2

仅供参考,我只是表演

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 的性能下降(因为数组可以将其元素放在堆栈上,这样更快),一个体面的算法将使用两个集合以相同的幅度执行。

于 2016-04-20T02:31:46.590 回答