5
public void zero() {
    int sum = 0;
    for (int i = 0; i < mArray.length; ++i) {
        sum += mArray[i].mSplat;
    }
}

public void one() {
    int sum = 0;
    Foo[] localArray = mArray;
    int len = localArray.length;

    for (int i = 0; i < len; ++i) {
        sum += localArray[i].mSplat;
    }
}

Android のドキュメントによると、上記のコードではゼロの方が遅いです。しかし、私はなぜ理解していないのですか?まあ、私はそれほど深く学んでいませんが、私が知ってlengthいるように、メソッドではなくフィールドです。では、ループがその値を取得するとき、ローカル変数から取得するのとどう違うのでしょうか? 配列の長さは、初期化されると常に固定されます。何が欠けていますか?

4

4 に答える 4

3

最初の例では、JVM はまず配列への参照をフェッチしてから、その長さフィールドにアクセスする必要があります。

2 番目の例では、1 つのローカル変数にのみアクセスします。

デスクトップJVMでは、これは一般的に最適化されており、2つの方法は同等ですが、AndroidのJVMはそうではないようです...まだ...

于 2013-08-13T10:09:52.317 に答える
2
  public void zero() {
    int sum = 0;
    for (int i = 0; i < mArray.length; ++i) {
        sum += mArray[i].mSplat;
    }
}

ここで for ループの配列の長さを見ると、反復ごとに計算されるため、パフォーマンスが低下します。

  public void one() {
    int sum = 0;
    Foo[] localArray = mArray;
    int len = localArray.length;

    for (int i = 0; i < len; ++i) {
        sum += localArray[i].mSplat;
    }
}

この場合、長さは for ループの前に計算され、ループで使用されます。

于 2013-08-13T10:09:40.603 に答える