SORU
21 Ocak 2010, PERŞEMBE


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
21 Ocak 2010, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BruBearBaby

    BruBearBaby

    25 Ocak 2011
  • Dom Esposito

    Dom Esposito

    26 Mayıs 2011
  • oHeymarvin

    oHeymarvin

    11 Temmuz 2013