[关闭]
@ruanxingzhi 2017-04-05T15:29:29.000000Z 字数 650 阅读 1427

卡常数教程

“这是有理有据的底层优化。”
“您果有理有据。”

本文适用于不开编译器优化的场景。

优化cache

我们访问内存的某个地址时,它和相邻的元素被放进缓存。访问完某个元素后立刻访问附近的元素,速度将会很快。

因此,按顺序访问元素,比随机访问元素要快。

优化寻址

对于多维数组,寻址要用到乘法:
A[x][y] -> A + (x*n + y)

这会严重拖慢速度(尤其在三维及以上),因此我们可以自己算出指针。下面是一个例子。

  1. // Code A
  2. for(i=1;i<=n;i++)
  3. ans+=A[x][y][z][i];
  4. // Code B
  5. int *p=A[x][y][z];
  6. for(i=1;i<=n;i++)
  7. ans+=*(p+i);

上面的代码中,BA要快。

寄存器变量

将变量直接放进寄存器。通常情况下优化并不明显

  1. // Code A
  2. for(int i=1;i<n;i++)
  3. ans+=i;
  4. // Code B
  5. for(register int i=1;i<n;i++)
  6. ans+=i;

上面的代码中,BA要快。

循环展开

通常情况下优化并不明显

  1. // Code A
  2. for(i=1;i<=n;i++)
  3. ans+=A[i];
  4. // Code B
  5. int ans1=0,ans2=0,ans3=0,ans4=0;
  6. for(i=1;i<=n;i+=4)
  7. {
  8. ans1+=A[i];
  9. ans2+=A[i+1];
  10. ans3+=A[i+2];
  11. ans4+=A[i+3];
  12. }
  13. ans=ans1+ans2+ans3+ans4;

循环展开层数不宜太多。上面展开了4层,展开层数太多可能反而变慢。

最后祝您身体健康,再见。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注