二维数组及其在c++中的性能
2D arrays and their performance in C++
我想优化一段区域增长代码,该代码目前在其算法中使用两个2D数组。一个2D数组保存了2D纹理中每个像素的访问状态,一个2D数组保存了每个像素的"should be masking"布尔值。
我运行Intel VTune Amplifier XE来分析该方法的性能。下面是512x512图像最重要的统计数据:
- 在array2D[x][y]中查找需要~10-15ms
- 写入array2D[x][y]需要~1-2ms 创建和初始化每个数组需要8-10ms
此外,我执行的读操作几乎和写操作一样多。以最基本的方式创建2D数组:
bool** array2D = new bool*[desc.Width];
for(unsigned int i = 0; i < desc.Width; ++i)
array2D[i] = new bool[desc.Height];
for(unsigned int x = 0; x < desc.Width; x++){
for(unsigned int y = 0; y < desc.Height; y++){
array2D[x][y] = false;
}
}
我正在寻找更好的结构来保存这些信息。欢迎提供代码示例,以及一般想法(包括估计)。
您可以通过从2D数组切换到1D数组来尝试以牺牲可读性为代价来优化性能。您可以使用array[x*Height+y]
或array[x+y*Width]
(以行为主或以列为主的顺序)代替array2D[x][y]
,这取决于您的访问模式。这样可以避免单独分配。
如果数组很大,还可以尝试将布尔值打包成更大的整型。这将使访问代码稍微慢一些,但是相当小的内存占用可能会用更好的缓存性能来弥补访问速度的减慢。
将2d数组转换为1d数组:
type* array = new type[width * height];
array[x + y * width] = data_at_x_y;
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- std::p mr::memory_resource 如何与 std::container 产生性能差异?
- 不同的类或结构初始化方法之间的性能差异是什么?