具有c维对象的N维数组与具有C对象的N维数组的执行方式有何不同?

时间:2013-09-17 13:34:59

标签: arrays opencv data-structures

摘自O'Reilly的书:

enter image description here

从上面的摘录中,作者在性能方面解释了为什么在大哦或其他术语中应该存在性能差异,以及通过c维数组在n中找到任何元素的公式的基础。

附加:为什么三维示例中使用了不同的数据类型?你为什么还要用不同的方式来代表这个呢?

1 个答案:

答案 0 :(得分:1)

这篇文章似乎指出了表示矩阵数据结构和单个数组表示的性能增益的不同方法,尽管它并没有真正解释为什么你会获得性能提升。

例如,表示NxNxN矩阵:

以对象形式:

Cell {
   int x,y,z;
}
Matrix {
   int size = 10;
   Cell[] cells = new Cell[size];
}

以三阵列形式:

Matrix {
    int size = 10;
    int[][][] data = new int[size][size][size];
}

在一个阵列中:

Matrx {
    int size = 10;
    int[] data = new int[size*size*size];
}

对于你的问题,通过将NxN矩阵表示为N * N长度的单个数组,可以获得性能提升,因为缓存而获得性能(假设你不能将整个矩阵放在一个块中);单个数组表示保证整个矩阵将位于连续的内存块中。当数据从内存移动到缓存(或磁盘到内存)时,它会以块的形式移动,有时会抓取比您需要的数据更多的数据。您获取的额外数据包含您需要的数据周围区域。

说,您正在逐行处理矩阵。获取新数据时,操作系统每个块可以获取N + 10个项目。在NxN情况下,额外数据(+10)可能是不相关的数据。在N * N长度数组的情况下,额外数据(+10)最有可能来自矩阵。

SGI的这篇文章似乎提供了更多细节,特别是好缓存使用原则: http://techpubs.sgi.com/library/dynaweb_docs/0640/SGI_Developer/books/OrOn2_PfTune/sgi_html/ch06.html