@ruanxingzhi
2017-04-05T15:29:29.000000Z
字数 650
阅读 1427
“这是有理有据的底层优化。”
“您果有理有据。”本文适用于不开编译器优化的场景。
我们访问内存的某个地址时,它和相邻的元素被放进缓存。访问完某个元素后立刻访问附近的元素,速度将会很快。
因此,按顺序访问元素,比随机访问元素要快。
对于多维数组,寻址要用到乘法:
A[x][y] -> A + (x*n + y)
这会严重拖慢速度(尤其在三维及以上),因此我们可以自己算出指针。下面是一个例子。
// Code A
for(i=1;i<=n;i++)
ans+=A[x][y][z][i];
// Code B
int *p=A[x][y][z];
for(i=1;i<=n;i++)
ans+=*(p+i);
上面的代码中,B
比A
要快。
将变量直接放进寄存器。通常情况下优化并不明显。
// Code A
for(int i=1;i<n;i++)
ans+=i;
// Code B
for(register int i=1;i<n;i++)
ans+=i;
上面的代码中,B
比A
要快。
通常情况下优化并不明显。
// Code A
for(i=1;i<=n;i++)
ans+=A[i];
// Code B
int ans1=0,ans2=0,ans3=0,ans4=0;
for(i=1;i<=n;i+=4)
{
ans1+=A[i];
ans2+=A[i+1];
ans3+=A[i+2];
ans4+=A[i+3];
}
ans=ans1+ans2+ans3+ans4;
循环展开层数不宜太多。上面展开了4
层,展开层数太多可能反而变慢。
最后祝您身体健康,再见。