我编写了一个元胞自动机程序,将数据存储在矩阵(数组数组)中。对于 300*200 矩阵,我可以使用静态内存分配(例如)实现每秒 60 次或更多次迭代std::array
。
我想生成不同大小的矩阵,而无需每次都重新编译程序,即用户输入一个大小,然后开始对该矩阵大小的模拟。但是,如果我使用动态内存分配(例如std::vector
),模拟下降到每秒约 2 次迭代。我怎么解决这个问题?我采取的一种选择是预先分配一个比我预期用户将选择的更大的静态数组(例如 2000*2000),但这似乎很浪费,并且在某种程度上仍然限制了用户的选择。
我想知道我是否可以
a)分配一次内存,然后以某种方式“冻结”它以获得普通的静态数组性能?
b) 或对 ? 执行更有效的操作std::vector
?作为参考,我只是对矩阵执行matrix[x][y] == 1
和matrix[x][y] = 1
操作。
根据this question/answerstd::vector
,使用指针或使用指针在性能上没有区别。
编辑:
根据 UmNyobe 的建议,我已将矩阵重写为单个数组,可通过matrix[y*size_x + x]
. 使用动态内存分配(启动时调整一次),我将性能提高一倍,达到每秒 5 次迭代。
根据 PaulMcKenzie 的评论,我编译了一个发布版本并获得了我正在寻找的性能(每秒 60 次或更多次迭代)。但是,这是更多的基础,所以我仍然想更彻底地量化一种方法相对于另一种方法的好处,所以我使用了std::chrono::high_resolution_clock
每次迭代的时间,发现动态和静态数组之间的性能差异(使用后单个数组矩阵表示)在误差范围内(每次迭代 450~600 微秒)。
然而,调试期间的性能是一个小问题,所以我想我会保留两者,并在调试时切换到静态数组。