Hangisi daha verimli, her döngü, ya da yineleyici bir mi?
Geçiş için en etkili yoldur bir koleksiyonu olan?
List<Integer> a = new ArrayList<Integer>();
for (Integer integer : a) {
integer.toString();
}
ya
List<Integer> a = new ArrayList<Integer>();
for (Iterator iterator = a.iterator(); iterator.hasNext();) {
Integer integer = (Integer) iterator.next();
integer.toString();
}
Bu kesin değildir, , *, *15thisthis, ya Son soru cevapları biri yakın geliyor olsa da this yinelenen. Bu bir kukla değildir, bunun nedeni, bu döngü içinde get(i)
call döngüler, yineleyici kullanmak yerine karşılaştırılması.
Bu soruya cevabım yayınlayacaklar Meta önerdi.
CEVAP
Eğer sadece etrafında dolaşıp koleksiyonu için okumak tüm değerleri çıktı, sonra bir farkı kullanarak bir yineleyici ya da yeni bir döngü sözdizimi, yeni bir sözdizimi kullanır sadece yineleyici sualtı.
Ancak, döngü demek eski "c-style" döngü:
for(int i=0; i<list.size(); i ) {
Object o = list.get(i);
}
Döngü için yeni, ya da yineleyici, çok daha verimli, temel veri yapısına bağlı olabilir. Bu bazı veri yapıları, get(i)
I nedeni(n) döngü bir Ey yapar işlemi, (n2) işlemi. Geleneksel bağlantılı bir listesi gibi bir veri yapısı bir örnektir. Tüm yineleyicisi next()
(1) Ç işlemi, döngü O(n) olması gereken temel bir gereklilik olarak.
Yineleyici sualtı döngü sözdizimi için yeni tarafından kullanılan doğrulamak için aşağıdaki iki Java parçacıkları tarafından oluşturulan bytecodes karşılaştırın. İlk döngü için:
List<Integer> a = new ArrayList<Integer>();
for (Integer integer : a)
{
integer.toString();
}
// Byte code
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
GOTO L2
L3
ALOAD 3
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 2
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L2
ALOAD 3
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L3
Ve ikinci olarak, yineleyici:
List<Integer> a = new ArrayList<Integer>();
for (Iterator iterator = a.iterator(); iterator.hasNext();)
{
Integer integer = (Integer) iterator.next();
integer.toString();
}
// Bytecode:
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
GOTO L7
L8
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 3
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L7
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L8
Gördüğünüz gibi, oluşturulan byte kod ya da formu kullanarak performans ceza var hiç bu kadar etkili aynıdır. Bu nedenle, en az klişe sahip olduğu için-her döngü olacak estetik olarak size hitap eden, çoğu insan için kod döngü şeklinde seçmelisiniz.
Bu iki döngü için zaman ve önbellek pe...
Python, nasıl bir yineleyici üzerinde ...
Hangisi daha fazla ölçülebilir, CTE ya...
Daha verimli olan C, dizeleri bitiştir...
Negatif değerler için kontrol etmek ye...