2011-11-24 37 views
1

我正在编写使用大型矩阵的代码,其中元素是用户定义的类。为了建立这个矩阵,我使用下面的向量向量。用矢量向量描述一个非常长的矩阵,哪个维度应该是最大的?

using namespace std; 
vector< vector<userclass> > matrix = vector<vector<userclass> >(sizeX, vector<userclass>(sizeY)); 

这个类,也可能是一个结构,将包含一些内置函数,如浮点数和指针。所以这里是这样的: 假设矩阵在一个方向上的大小为2000,但在另一个方向上只有20的大小,但是我可以完全自由地选择哪一个。为了获得最佳性能,我应该选择哪一个最大,sizeXsizeY?换句话说:哪个更快,大矢量的小矢量,还是小矢量的大矢量?有没有区别?

性能优化应该是针对单个随机访问。

+3

您可能想看看boost的多维数组库,因为它不仅更好地使用内存,而且还为您提供标准迭代和其他细节:http://www.boost。org/doc/libs/1_48_0/libs/multi_array/doc/user.html – HostileFork

回答

4

您应该针对最少的载体数量,也就是说sizeY应该大于sizeX以获得最佳缓存性能,更不用说占用更少的空间。


当然,这取决于你打算如何使用它们。如果可以,尽可能长时间访问矢量 - vec[i][j]vec[j][i]好得多。如果你必须做vec[j][i]那么让sizeX变大可能会有更好的表现,或者使用1个连续阵列。

其中sizeX>sizeY最快的迭代:

for(int i...) 
for(int j...) { 
    vec[i][j]; 
} 
+0

它们将被使用的方式是:一旦创建并设置(对时间不敏感的操作),矩阵仅被读取(从未写入)。在运行期间,它每次访问一个元素,我无法控制哪个元素将被读取,我没有理由认为它是顺序的。尽管如此,遵循你所说的,拥有几个大的向量使我有更好的机会重复访问同一个向量(即使它只有20个中的1个)。 – Malabarba

0

有不同的东西在这里考虑的问题。首先,您可能最好定义自己的matrix类型,该类型包含大小为sizeX*sizeY的单个数据矢量以及将坐标映射到矢量中元素位置的运算符。 这种方法的优点是内存占用将更加紧凑(使用的内存减少了),并且内存将是连续的。

至于应该如何完成映射,并主要考虑性能,这取决于数据的使用情况。如果你要在特定的方向上进行迭代,你希望在这个方向上连续的元素在内存中占据连续的位置(也就是说,如果你要在Y的外部循环和X上的内部循环迭代,那么公式应pos = y * sizeX + x

假设类型需要10个字节,20种元素的2000个向量的向量取(2000+1)*sizeof(vector) + 2000*20*10字节,2000个元素20个向量的向量将需要大约(20+1)*sizeof(vector) + 2000*20*10字节,和一个单一的矢量2000*20元素大小为sizeof(vector)+2000*20*10字节大致在64位平台发布时没有额外的调试信息,sizeof(vector<X>) ~ 3*8(即24字节),总数为:448024,400504400024字节。这可能没有多大的区别,但是在第一种情况下,与最佳情况相比,使用中的额外10%的内存。

相关问题