この記事から、
手書きのカウントループは約 3 倍高速です
配列リストを反復するための強化された for ループよりも。
まず、「手書きのカウントループ」とはどういう意味ですか?彼らは、これが何を意味するのかを明確に説明していません。第二に、これが配列リストにのみ当てはまり、他のコレクションには当てはまらないのはなぜですか?
まず、「手書きのカウントループ」とはどういう意味ですか?
私は彼らが意味すると思います
for(int i=0;i<list.size();i++) {
list.get(i);
}
第二に、これが配列リストにのみ当てはまり、他のコレクションには当てはまらないのはなぜですか?
ArrayList は効率的なランダム アクセスをサポートしており、Iterator を削除すると小さな改善が得られます。(または、他に何もしないループがある場合は、相対的に大幅に改善されます)
LinkedList などの他のコレクションの場合、Iterator を使用する方get(n)
が遅いため、高速です。セットの場合はありませんget(n)
この質問に対する答えはすべて (私がこれを書いている時点では 3 つの答えがあります)、間違っています。
Android では、手書きのループに対してこれを行うべきではありません。
for(int i=0;i<list.size();i++) {
list.get(i);
}
上記は間違っています。
ループは次のようになります (サイズは一時的に独自の変数にコピーされます)。
int size = list.size();
for(int i=0;i<size;i++) {
list.get(i);
}
そうしないと、ループの反復ごとにルックアップ ペナルティが発生します。質問からリンクされた記事を注意深く読むと、Google もこのパターンを推奨していることがわかります。
手書きのカウント ループは、同じ記事内zero()
またはone()
同じ記事内のループのように見えます。
List<Foo> foos = new ArrayList<Foo>();
// populate the list...
for (int i=0; i<foos.size(); i++) {
Foo foo = foos.get(i);
// do something with foo
}
手書きのカウントループです。つまり、配列内の各要素をカウントするループを手動で作成したということです。
for (int i = 0; i < mArray.length; ++i) {
これは、基礎となる実装が与えられた配列リストにも当てはまります。強化された for ループは汎用的に機能する必要があるため、特定のことを想定できません。インデックスの開始点と終了点など。