SORU
21 EYLÜL 2008, Pazar


Döngü iyi performans verdi? Neden?

String s = "";
for(i=0;i<....){
    s = some Assignment;
}

ya

for(i=0;i<..){
    String s = some Assignment;
}

'S' döngü dışında asla. kullanmana gerek yok İlk seçenek, yeni bir Dize her zaman başlatılmadı beri belki de daha iyi. İkinci ancak değişken döngü kendisi için sınırlı kapsamı neden olacaktır.

EDİT: Milhous cevabı yanıt Olarak. Bir döngü içinde sürekli bir Dize değil mi atamak için anlamsız olurdu? Bazı Atama 'değişen bir değer listesinde yinelenen varlık var demektir. yok burada

Ayrıca, soru, bellek yönetimi hakkında endişeli olduğum için değil. Sadece iyi olduğunu bilmek istiyorum.

CEVAP
21 EYLÜL 2008, Pazar


Sınırlı kalması En iyisidir

İkinci seçeneği kullanın:

for ( ... ) {
  String s = ...;
}

Kapsam Performansını Etkilemez

Senden her derlenmiş olduğunu GÖRDÜM javap aletle () kodu parçalara ayrılırsa, bu döngü her iki durumda da aynı JVM talimatları derler göreceksiniz. "Seçenek #3" Seçeneği ile aynıdır #1. Aynı zamanda Brian R. Bondy's unutmayın Hiçbir ekstra sıkı kapsamı kullanırken veya yığından ekledi kaldırılır ve aynı veri her iki durumda yığında kullanılır.

Erken Başlatma Kaçının

İki dava arasındaki tek fark, ilk örnekte, değişken s gereksiz yere başlatıldı. Bu değişken bildiriminde yeri ayrı bir konudur. Bu iki boşa talimatları (dize sabiti yük ve yığın çerçeve yuvasına saklamak için) ekler. İyi bir statik analiz aracı asla s, atadığınız değeri okuduğunuz sizi uyarır ve iyi JİT derleyici muhtemelen zamanında o kişiye.

Bu sadece boş bir beyan (yani, String s;) kullanarak düzeltebilirsin, ama bu kötü bir uygulama olarak kabul edilir ve başka bir yan etkisi aşağıda ele vardır.

Sık sık null gibi sahte bir değer, sadece bir değişken başlatıldı olmadan okunan derleyici bir hata hush için bir değişkene atanır. Bu hata değişken kapsamı çok büyük ve geçerli bir değer almak için gerekli önce bildirilmiş olduğunu bir ipucu olarak alınabilir. Boş bildirimleri her kod yolu düşünmeye zorlamak; sahte bir değer atayarak bu değerli uyarı göz ardı etmeyin.

Yuva Yığını Korumak

Belirtildiği gibi, JVM talimatları her iki durumda da aynı olsa da, bunu en iyi yapan yan etkisi ince, JVM seviyesinde, mümkün olan en sınırlı kapsamı kullanmak için vardır. Bu "" yöntemi. yerel değişken tablo görünür. Eğer çoklu döngüler, değişkenler gereksiz yere geniş kapsamda bildirilen olan varsa ne olur: düşünün

void x(String[] strings, Integer[] integers) {
  String s;
  for (int i = 0; i < strings.length;   i) {
    s = strings[0];
    ...
  }
  Integer n;
  for (int i = 0; i < integers.length;   i) {
    n = integers[i];
    ...
  }
}

s n kendi döngüsü içinde ilan etmiş olabilir, ama onlar değil, derleyici kullanır değişkenleri iki "slot" yığın çerçevesi. Eğer döngü içinde ilan etmiş olsaydı, derleyici aynı yuvası, çerçeve daha küçük yığın yaparak, yeniden kullanabilirsiniz.

Gerçekten Neyin Önemli

Ancak, bu sorunların çoğu önemsİzdİr. İyi JİT derleyici mümkün müsrifçe atıyorsanız başlangıç değeri okuyun ve atama optimize uzakta olmadığını göreceksiniz. Burada ya da orada bir yuva tasarruf veya uygulama kırmak için gitmiyor.

Önemli şey, Kodu ve bakımı kolay okunabilir hale getirmek ve bu bağlamda, sınırlı bir kapsamı kullanarak daha iyidir. Küçük bir kapsam değişken var, daha kolay nasıl kullanılır ve kod herhangi bir değişiklik olacak ne tahmin etmek güç değil.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dave Wallace

    Dave Wallace

    27 Kasım 2007
  • Friday Night Cranks

    Friday Night

    27 Mayıs 2007
  • Sergio Fernandez

    Sergio Ferna

    1 EKİM 2009