编码原则

本文探讨了编程中的局部性思想,强调时间与空间局部性在优化程序性能中的作用,特别是在循环中的应用。通过减少过程调用和不必要的内存引用,可以显著提升代码执行效率。例如,在矩阵乘法中利用空间局部性改进内层循环,以及通过使用临时变量减少内存访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

局部性思想

时间局部性:在程序中指令被多次调用;
空间局部性:指令按照连续的内存顺序执行;并且步长越小越好(相对于元素大小)
例如,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
数组中的数据是按行进行存储的,所以循环需要按照数组的列进行扫描以达到更好的空间局部性(步长只有一个元素)。
与内存访问总数相比,高速缓存块的不命中率是一个更好的性能预测指标。
例如一个 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)
      }
   }
}

减少过程调用

减少循环中的函数调用。

消除不必要的内存引用

把结果放在临时变量中,避免对内存的读写需要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值