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 マイクロ秒で実行され、2 番目のコードは 3.5 マイクロ秒で実行されます。ループを 2 つの小さなループに分割すると、コードのパフォーマンスが向上するようです。なんで?

コードの 2 つのバージョンを異なる方法でコンパイルするのはコンパイラですか? プロセッサがループコード全体をキャッシュに入れることができないため、異なるキャッシュゾーン間でスワップする必要があるためである可能性があることをどこかで読みましたが、2番目のケースでは可能であり、高速になります。この議論がよくわからない。それは可能だと思いますか?他のアイデアはありますか?

これについて非常に必要な助けをありがとう。

4

0 に答える 0