我正在进行一项性能测试,并发现改变代码的顺序可以使其更快,而不会影响结果。
性能是使用chrono库来测量时间执行。
vector< vector<float> > U(matrix_size, vector<float>(matrix_size,14));
vector< vector<float> > L(matrix_size, vector<float>(matrix_size,12));
vector< vector<float> > matrix_positive_definite(matrix_size, vector<float>(matrix_size,23));
for (i = 0; i < matrix_size; ++i) {
for(j= 0; j < matrix_size; ++j){
//Part II : ________________________________________
float sum2=0;
for(k= 0; k <= (i-1); ++k){
float sum2_temp=L[i][k]*U[k][j];
sum2+=sum2_temp;
}
//Part I : _____________________________________________
float sum1=0;
for(k= 0; k <= (j-1); ++k){
float sum1_temp=L[i][k]*U[k][j];
sum1+=sum1_temp;
}
//__________________________________________
if(i>j){
L[i][j]=(matrix_positive_definite[i][j]-sum1)/U[j][j];
}
else{
U[i][j]=matrix_positive_definite[i][j]-sum2;
}
}
}
我使用 g++ -O3
(GCC 7.4.0 在 Intel i5/Win10 上) 进行编译。
如果 Part II 在 Part I 之前执行,则改变 Part I & Part II 的顺序可以获得更快的结果。发生了什么?
以下是整个程序的链接。
0..min(i,j)
。而且,你扔掉了其中一个sum1
/sum2
。我会先重构这段代码,避免不必要的计算。也许编译器能够在某个版本中注意到这一点,而在另一个版本中则不能。 - geza