1

我注意到下面的代码

    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 微秒内运行。似乎将循环分成两个较小的循环可以提高我的代码的性能。为什么?

是编译器以不同方式编译我的代码的两个版本吗?我在某处读到这可能是因为处理器无法将整个循环代码放入其缓存中,因此需要在不同的缓存区域之间进行交换,而在第二种情况下,它可以,因此它运行得更快。我不确定是否理解这个论点。这听起来可能吗?还有其他想法吗?

感谢您在这方面提供的急需帮助。

4

0 回答 0