2“for”循环比1循环快两倍

时间:2013-11-15 01:39:12

标签: java performance

我注意到以下代码

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

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

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

0 个答案:

没有答案
相关问题