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()
(したがって、結果はアレイのドキュメントで説明されているものと同様に見えます)。