0

我最近刚刚完成了一个 android 项目,我已经完成了一些 ArrayList 的广泛代码并在上面做循环的东西。我在这里有两组循环示例。

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

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

}

for(SomeObject obj: object){

}

如果您不需要递增值,我认为第二个很好,而且我认为比第一个更具可读性和简洁性。但就速度、性能和内存使用而言,这两个循环中的什么是理想或高效的使用?

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 回答