局部性思想
时间局部性:在程序中指令被多次调用;
空间局部性:指令按照连续的内存顺序执行;并且步长越小越好(相对于元素大小)
例如,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
数组中的数据是按行进行存储的,所以循环需要按照数组的列进行扫描以达到更好的空间局部性(步长只有一个元素)。
与内存访问总数相比,高速缓存块的不命中率是一个更好的性能预测指标。
例如一个 n x n 的矩阵乘法:需要 n x n x n 次加法运算,所以也需要这么多次迭代,
利用空间局部性,达到性能优化,在最内层循环中对列进行扫描使其步长为1
//i j 代表行与列,k为标识符,令标识符不变,对所有的行列进行排列,然后对标识符迭代,再对所有的行列进行同样的排列再与之前排列好的相加,循环下去即为矩阵乘法结果
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
r=A[i][k];//扫描A的每一行
for (j=0;j<n;j++)
{
c[i][j]+=r * B[k][j];//元素相乘再相加,保持格式:(i x k) x (k x j)
}
}
}
减少过程调用
减少循环中的函数调用。
消除不必要的内存引用
把结果放在临时变量中,避免对内存的读写需要。