尽可能的优化代码性能
如下代码成为了系统的瓶颈,请尽可能的优化;
要求找到优化的点和优化方案,分析说明原因。
代码如下:
#define M 10000
#define N 10000
#define L 3
int arr[L][M][N];
int xxx[M * N];
int main()
{
// init arr and xxxfirst, omit
// start
for (int r=0;r<10000; ++r)
{
f(arr);
}
return 0;
}
void f( intarr[L][M][N] )
{
int k = 0;
for ( int m=0;m<M; m++ )
{
for( int n=0; n<N; n++ )
{
for ( int l=0; l<L; l++)
{
int ss = arr[l][m][0] + 1111;
int tmp = sss + power( log(arr[l][m][n] ), 3 );
arr[l][m][n] = a[l][m][n] + tmp;
xxx[k] += arr[l][m][n];
}
k = k + 1;
}
}
}
修改点:
1. power函数,可以直接写成a*a*a,这个优化效果与机器型号有关
2. 改变数据结构,arr[L][M][N]修改成arr[M][N][L],修改后的好处:
a) 内层循环的一些共有计算可以提前
b) 内层数据访问被连续存储,cache命中率极度提升(最重要也是最根本的优化点)
3. 改变循环方式,for l, for m, for n;配合2,修改循环方式后,可以对l循环进行循环展开,减少分支预测失败
4. ….