0

我创建了一个非常简单的代码来了解向量访问是否比矩阵访问更快。

我尝试了 3 件事:

1:创建一个包含 100.000.000 个 int 元素的向量:

int *matrix=(int*)malloc(sizeof(int)*100000*1000)
for(long int=x;x<100000*1000;x++)matrix[x]=1;

2:创建一个大小相同的矩阵:

int ** matrix=(int**)malloc(sizeof(int*)*100000);
for(long int=0; x<100000;x++){
   matrix[x]=(int*)malloc(sizeof(int*)*1000);
}
for(int x=0; x<100000;x++){
   for(int y=0;y<1000;y++){
     matrix[x][y]=1;
   }
}

3:创建相同的向量,但在其中写入矩阵

for(int x=0; x<100000;x++){
   for(int y=0;y<1000;y++){
     matrix[(x*1000)+y]=1;
   }
}

总是矩阵访问(CASE 2)需要 2 倍的情况 1 和 3。情况 3 比情况 1 快一点。我在我的 C++ 编译器(g++)中使用 -O2 参数

我可以理解为什么向量比矩阵更快:(但我会喜欢一些解释)。但我不明白为什么案例 3 比案例 1 快,我想乘法过程会减慢很多事情,而不是让它更快。我不明白为什么,即使差异是 0.002(可能是时间和当时的处理器使用情况(我想))

如果我在没有优化的情况下编译所有 3 个案例,则案例 2 比案例 1 慢,案例 3。因此,如果没有优化过程,案例 1 更快。

Vector 通常更快?

谢谢

4

1 回答 1

1

案例 2 最慢的原因是因为它多了一层间接性。

在情况 1 和 3 中,您从内存中获取所需的元素。而在情况 2 中,您首先必须从内存中获取行/列数组的地址,然后才能从所需元素中获取。在现代计算机中,内存访问是最昂贵的操作(就执行而言),难怪它要慢得多。

正如预期的那样,1 和 3 的差异非常小。摆弄优化选项已经产生了影响,因此在这里没有人可以在知道您正在使用的确切机器的情况下给您一个明确的答案。这里最好的(也是唯一合理的)方法是查看生成的汇编代码。一个原因可能是,在一个版本中,您的循环变量很长,而在另一个版本中则不是(因此您在那里进行元素地址计算),这取决于您的 CPU,这可能会有所不同。

编辑:您的措辞选择非常糟糕,因为没有矩阵内存访问。记忆总是平坦的。矩阵寻址只是您放在顶部的“虚拟”寻址(直接像您在 3 中所做的那样)或间接(通过使用例如为您完成它的不同语言,例如 fortran)。因此,您或多或少可以区分矩阵的不同内存布局。在 3 中,您将矩阵作为矩阵中的一大块,而在 2 中,您将它逐行/逐列地保存在内存中,其缺点是它多了一层间接性(但有优点是您可以更快地执行某些操作,例如交换到行,并且对于垃圾收集器可能更好)。还有许多其他方法可以将矩阵存储在内存中(尤其是如果您必须处理稀疏矩阵)。

于 2012-07-30T15:33:11.153 回答