Java中相同的代码片段在两个程序中花费的时间非常不同?
基本上我有两个基于启发式的算法。我在这两个版本中都使用了一段代码。代码采用激励向量,并基于该向量给出成本函数的值。代码的一部分生成激励向量。这一部分对于两种算法是不同的。代码的另一部分基于激励向量计算成本函数。这一部分对于两种算法都是逐字逐句的。然而,在一种算法(基于遗传算法)中,执行该代码需要5到10秒,而在另一种算法中,相同的代码需要5分钟以上。我不明白为什么会有如此巨大的差异。下面是代码中执行时间不同的部分。显而易见,本部分包括循环的基本知识和简单的数学知识。所有其他数组的值都是已知的,目标是计算“CurrentInv”Java中相同的代码片段在两个程序中花费的时间非常不同?,java,algorithm,runtime,genetic-algorithm,execution-time,Java,Algorithm,Runtime,Genetic Algorithm,Execution Time,基本上我有两个基于启发式的算法。我在这两个版本中都使用了一段代码。代码采用激励向量,并基于该向量给出成本函数的值。代码的一部分生成激励向量。这一部分对于两种算法是不同的。代码的另一部分基于激励向量计算成本函数。这一部分对于两种算法都是逐字逐句的。然而,在一种算法(基于遗传算法)中,执行该代码需要5到10秒,而在另一种算法中,相同的代码需要5分钟以上。我不明白为什么会有如此巨大的差异。下面是代码中执行时间不同的部分。显而易见,本部分包括循环的基本知识和简单的数学知识。所有其他数组的值都是已知的,目
long start6=System.currentTimeMillis();
对于(int a=0;a你知道这是导致延迟的特定部分吗?这段代码是提取到一个单独的方法中,该方法使用两种启发式算法调用完全相同,还是复制并粘贴两次?你能在答案中添加两个部分,在慢速和快速情况下给出以下变量的值吗?\u inv索引,No.1,_destNE。另外,如果你能给出nSizeD和nSizeO元素的粗略近似值,那会很有帮助。你的激励向量在这两种情况下是相同的,还是不同的?如果不同,这是否说明了在缓慢的情况下处理时间更长?@Daniel我假设他运行了代码并观察了运行所需的时间;参见他样本的最后一行。@Patrick87嗯,好的,打得好。
long start6 = System.currentTimeMillis();
for(int a=0;a<_invIndex;a++){
CurrentInv[a]=Invs[a];
for (int i=0; i<no1;i++){
for(int j=0;j<no1;j++){
if(i!=j){
for(int b=0; b<_destNe; b++){
if(countOD[i][j]>0){
if(i==b){
if(j==a){
CurrentInv[a]=CurrentInv[a]+onlyBike[i][j][0][(int)nSizeO[i][j]+1]*countOD[i][j]*x[i][j][0][(int)nSizeO[i][j]+1];
}
}}
if(countOD[i][j]>0){
if(nSizeO[i][j]!=0){
for(int k=1; k<(int)nSizeO[i][j]+1; k++){
if( jaggedO[i][j][k-1]==b){
if( j==a){
CurrentInv[a]=CurrentInv[a]+onlyBike[i][j][k][(int)nSizeO[i][j]+1]*countOD[i][j]*x[i][j][k][(int)nSizeO[i][j]+1];
}
}
}
}
if(nSizeD[i][j]!=0){
for(int d=(int)nSizeO[i][j]+2; d<(int)nSizeD[i][j]+(int)nSizeO[i][j]+2; d++){
if( jaggedD[i][j][d-(int)nSizeO[i][j]-2]==b){
if( j==a){
CurrentInv[a]=CurrentInv[a]+onlyBike[i][j][d][(int)nSizeO[i][j]+1]*countOD[i][j]*x[i][j][d][(int)nSizeO[i][j]+1];
}
}
}
}
if( i==b){
if(nSizeD[i][j]!=0){
for(int d=(int)nSizeO[i][j]+2; d<(int)nSizeD[i][j]+(int)nSizeO[i][j]+2; d++){
if( jaggedD[i][j][d-(int)nSizeO[i][j]-2]==a){
CurrentInv[a]=CurrentInv[a]+onlyBike[i][j][0][d]*countOD[i][j]*x[i][j][0][d];
}}
}}
if(nSizeO[i][j]!=0){
for(int k=1; k<(int)nSizeO[i][j]+1; k++){
if( jaggedO[i][j][k-1]==b){
if(nSizeD[i][j]!=0){
for(int d=(int)nSizeO[i][j]+2; d<(int)nSizeD[i][j]+(int)nSizeO[i][j]+2; d++){
if( jaggedD[i][j][d-(int)nSizeO[i][j]-2]==a){
CurrentInv[a]=CurrentInv[a]+onlyBike[i][j][k][d]*countOD[i][j]*x[i][j][k][d];
}}}
}
}
}
//countOD2[a][b]=countOD[i][j];
if(i==a){
if(j==b){
CurrentInv[a]=CurrentInv[a]-onlyBike[i][j][0][(int)nSizeO[i][j]+1]*countOD[i][j]*x[i][j][0][(int)nSizeO[i][j]+1];
}
}
if( i==a){
if(nSizeO[i][j]!=0){
for(int k=1; k<(int)nSizeO[i][j]+1; k++){
if( jaggedO[i][j][k-1]==b){
CurrentInv[a]=CurrentInv[a]-onlyBike[i][j][0][k]*countOD[i][j]*x[i][j][0][k];
}}}}
if( i==a){
if(nSizeD[i][j]!=0){
for(int d=(int)nSizeO[i][j]+2; d<(int)nSizeD[i][j]+(int)nSizeO[i][j]+2; d++){
if( jaggedD[i][j][d-(int)nSizeO[i][j]-2]==b){
CurrentInv[a]=CurrentInv[a]-onlyBike[i][j][0][d]*countOD[i][j]*x[i][j][0][d];
}}}}
//countOD2[a][b]=countOD[i][j];
if(nSizeO[i][j]!=0){
for(int k=1; k<(int)nSizeO[i][j]+1; k++){
if( jaggedO[i][j][k-1]==a){
if(nSizeD[i][j]!=0){
for(int d=(int)nSizeO[i][j]+2; d<(int)nSizeD[i][j]+(int)nSizeO[i][j]+2; d++){
if( jaggedD[i][j][d-(int)nSizeO[i][j]-2]==b){
CurrentInv[a]=CurrentInv[a]-onlyBike[i][j][k][d]*countOD[i][j]*x[i][j][k][d];
}}}
}
}
}
//countOD2[a][b]=countOD[i][j];
if(nSizeO[i][j]!=0){
for(int k=1; k<(int)nSizeO[i][j]+1; k++){
if( jaggedO[i][j][k-1]==a){
if( j==b){
CurrentInv[a]=CurrentInv[a]-onlyBike[i][j][k][(int)nSizeO[i][j]+1]*countOD[i][j]*x[i][j][k][(int)nSizeO[i][j]+1];
}
}
}
}
}
}
}
}
}
}
long end6 = System.currentTimeMillis();
_solutiontime = (end6 - start6);
System.out.println(" currentinvtime: "+_solutiontime);