因此,有两种方法可以通过首先迭代第一维或第二维来计算二维数组。但是,对于x86_64机器体系结构,获得二维数组之和的哪个更快?
这是求和数组行的C代码
int sum_array_rows(double a[16][16]){
int i, j;
double sum = 0;
for (i = 0; i < 16; i++)
for (j = 0; j < 16; j++)
sum += a[i][j];
return sum;
}
这是求和数组cols
int sum_array_cols(double a[16][16]){
int i, j;
double sum = 0;
for (j = 0; j < 16; j++)
for (i = 0; i < 16; i++)
sum += a[i][j];
return sum;
}
答案 0 :(得分:2)
这两个函数的复杂度是相同的。
但是,当CPU在其缓存中加载内存页面时,它可以更快地访问相邻单元(Spectre和Meltdown攻击基于此优化)。
数组是16行16列,在内存中就像
d[0][0]|d[0][1]|...|d[0][15]|d[1][0] ...
因此,理论上第一个应该更快。但是考虑到数组本身很小(在内存中),因此差异(如果有的话)应该很小。