1

我想优化一段区域增长代码,该代码目前在其算法中使用两个二维数组。一个 2D 数组保存 2D 纹理中每个像素的访问状态,一个 2D 数组保存每个像素的“应该被屏蔽”布尔值。

我运行了 Intel VTune Amplifier XE 来分析该方法的性能。下面是 512x512 图像最重要的统计数据:

  • 在 array2D[x][y] 中查找需要 ~10-15ms
  • 写入 array2D[x][y] 需要 ~1-2ms
  • 每个数组的创建和初始化大约需要 8-10 毫秒

此外,我执行的读取次数与写入次数大致相同。以最基本的方式创建二维数组:

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;
    }
}

我正在寻找性能更好的结构来保存这些信息。欢迎代码示例以及一般想法(包括猜测)。

4

2 回答 2

2

您可以通过从二维数组切换到一维数组来尝试以牺牲可读性为代价来优化性能。取而代之的是,array2D[x][y]您可以使用array[x*Height+y]or array[x+y*Width]行优先或列优先顺序),具体取决于您的访问模式。这将使您避免单独分配。

如果数组很大,您也可以尝试将布尔值打包成更大的整数类型。这将使访问代码稍微变慢,但相当小的占用空间可能会以更好的缓存性能来补偿较慢的访问。

于 2013-03-19T12:43:42.687 回答
1

将您的二维数组包装在一维数组中:

type* array = new type[width * height];
array[x + y * width] = data_at_x_y;
于 2013-03-19T12:42:55.753 回答