我注意到以下代码
boolean hasFoundSurplusChangedSign = false;
int h = 1;
for(int k=0; k<size; k++){
if (k==0){
mVCBArray[k]=mVBArray[k];
}else{
mVCBArray[k]=mVCBArray[k-1]+mVBArray[k];
}
mMVTArray[k]= Math.min(mVCBArray[k],mVCAArray[k]);
mSArray[k]= mVCBArray[k]-mVCAArray[k];
if (!hasFoundSurplusChangedSign && k>0){
if (Integer.signum(mSArray[k]) * Integer.signum(mSArray[k-1]) > 0){
h = k+1;
}else{
hasFoundSurplusChangedSign = true;
}
}
}
比这个跑得快:
boolean hasFoundSurplusChangedSign = false;
int h = 1;
for(int k=0; k<size; k++){
if (k==0){
mVCBArray[k]=mVBArray[k];
}else{
mVCBArray[k]=mVCBArray[k-1]+mVBArray[k];
}
mMVTArray[k]= Math.min(mVCBArray[k],mVCAArray[k]);
mSArray[k]= mVCBArray[k]-mVCAArray[k];
}
for(int k=0; k<size; k++){
if (!hasFoundSurplusChangedSign && k>0){
if (Integer.signum(mSArray[k]) * Integer.signum(mSArray[k-1]) > 0){
h = k+1;
}else{
hasFoundSurplusChangedSign = true;
}
}
}
所有数组都是int数组。每个数组的大小是常量并且等于1000。 for循环迭代大约100次(即大小= 100左右)。
因此,第一个代码平均运行6微秒,而第二个代码运行3.5微秒。 似乎将循环拆分为两个较小的循环可以提高我的代码的性能。 为什么呢?
编译器是否以不同的方式编译我的代码的两个版本? 我读到某处可能是因为处理器无法将整个循环代码放在其缓存中,因此需要在不同的缓存区之间进行交换,而在第二种情况下,它可以,因此它会更快。我不太明白这个论点。这听起来对你有用吗? 还有其他想法吗?
感谢你在这方面提供急需的帮助。