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