0

私は最近Androidプロジェクトを終了し、ArrayListの広範なコードを実行し、ループ処理を実行しました。ここにループの2つのセットの例があります。

ArrayList<SomeObject> object = new ArrayList<SomeObject>();

for(int c=0;c<object.size();c++){

}

for(SomeObject obj: object){

}

増分値が必要ない場合は、2つ目が適切だと思います。また、1つ目よりもはるかに読みやすく、すっきりしていると思います。しかし、2つのループのうち、速度、パフォーマンス、およびメモリ使用量の観点から使用するのに理想的または効率的なものは何でしょうか。

4

1 に答える 1

1

Androidドキュメントの提案によると、ループを作成するための最も効率的な方法は次のとおりです。

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

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

public void two() {
    int sum = 0;
    for (Foo a : mArray) {
        sum += a.mSplat;
    }
}

これらの方法は、JITを備えたデバイスでも同じパフォーマンスになることに注意してください。したがって、場合によっては、JITがオフになっています(たとえば、Eclipseを使用したデバッグ中)。異なる結果が観察two()される場合があります(より高速になりますone()

更新
次のコードを使用して、ArrayListsもチェックしました。

    final ArrayList<String> testArrayList = new ArrayList<String>(1000);

    for (int i = 0; i < 1000; i++) {
        testArrayList.add(String.valueOf(i<<2));
    }

    final TimingLogger timings = new TimingLogger("Loop", "ArrayLists");

    timings.addSplit("start");

    for (int loopCount = 0; loopCount < 1000; loopCount++) {
        int sum = 0;

        for (int i = 0; i < testArrayList.size(); i++) {
            sum += Integer.valueOf(testArrayList.get(i));
        }
    }

    timings.addSplit("zero()");

    for (int loopCount = 0; loopCount < 1000; loopCount++) {
        int sum = 0;
        final int len = testArrayList.size();

        for (int i = 0; i < len; i++) {
            sum += Integer.valueOf(testArrayList.get(i));
        }
    }

    timings.addSplit("one()");

    for (int loopCount = 0; loopCount < 1000; loopCount++) {
        int sum = 0;

        for (String item : testArrayList) {
            sum += Integer.valueOf(item);
        }
    }

    timings.addSplit("two()");
    timings.dumpToLog();

そして、次の出力を取得しました(JITを使用)。

ArrayLists: begin
ArrayLists:      0 ms, start
ArrayLists:      2713 ms, zero()
ArrayLists:      1753 ms, one()
ArrayLists:      1922 ms, two()
ArrayLists: end, 6388 ms

したがって、そのバリアントone()two()同様の結果が得られ、これらの結果はより高速であることがわかりますzero()(したがって、結果はアレイのドキュメントで説明されているものと同様に見えます)。

于 2013-02-25T01:38:02.303 に答える