“Yalnızca İhtiyacınız Olan Inum'lardan Kaçınma” neden Android'in performans ipuçlarından kaldırıldı?


175

"Yalnızca Ints'e İhtiyacınız Olan Numaralandırmalardan Kaçının" bölümü resmi geliştirici belgelerinden kaldırılmıştır . (Bkz. Android , eski bölüm içeriği için neden daha fazla numaralandırma kullanmıyor? )

Neden? Android VM'de ipucunu eski yapan bir değişiklik oldu mu?


2
Referans için, Shrubbery örneği için ayrıştırılmış bayt kodu şudur : https://gist.github.com/847418
Josh Lee

15
Mart 2014 itibariyle, aşağıdaki sayfa hala numaralandırma kullanımına karşı öneriler içermektedir: developer.android.com/training/articles/memory.html#Overhead
Tahir Akhtar

2
Bir yıl sonra, @TahirAkhtar'ın dediği gibi, resmi Android eğitimi hala "Android'de enums kullanmaktan kesinlikle kaçınmalısınız" diyor.
LarsH

1
Numaralandırmayı önleme önerisine dikkat çekmek ilginç bir Android geliştiricisinin bu 2015 makalesinde yer almaktadır: medium.com/google-developers/… Ayrıca: "Android Studio ve Gradle 1.3+ tarafından desteklenen @IntDef ek açıklamasını kullanmanın, int değişkenlerini kullanmanın boyut ve performans avantajlarını korurken kodunuzun çalışma zamanı türü güvenliğini (tiftik hataları etkinleştirildiğinde) verecektir. "
tonylo

4
Nisan 2018 itibarıyla, aşağıdaki sayfada artık numaralandırma kullanımına karşı tavsiye bulunmamaktadır. geliştirici.android.com/
Robin Davies

Yanıtlar:


157

bu belgenin orijinal versiyonu sadece bir dizi önyargıydı. yalnızca gerçek ölçütlerle desteklenen gerçekleri içerecek şekilde yeniden yazılmıştır ve VM güncellendiğinde güncellenir. http://code.google.com/p/dalvik/ adresinde çeşitli ölçütleri ve temel kütüphaneleri optimize etmek için kullandığımız bazı ölçütleri bulabilirsiniz .


35
Kimlik bilgilerinizi SO profilinizde listelediyseniz yardımcı olacaktır. Etrafı kazmam biraz zaman aldı. Ama şimdi VM ekibi üzerinde çalıştığınızı gördüğüme göre, cevabınızı resmi cevap olarak kabul edeceğim. :)
Thierry-Dimitri Roy

25
Bir enum sınıfı eklemek, elbette uygulamanızın fazladan bir sınıf içerdiği anlamına gelir, bu yüzden ücretsiz değildir , ancak bir geliştiricinin yalnızca yararlı oldukları yerlere numaralandırma eklediğini varsaymalıyız. Enums gördüm gerçekten kötü kullanımı gerçekten ints (bitmasks ve benzeri için) istedikleri bazı uyum kodunda ve "enum" herhangi bir makul anlamda bir enum değildi. Kendinizi "ordinal ()" olarak adlandırırken bulursanız, bu muhtemelen kötü bir koku anlamına gelir ve bu da bir numaralandırma istemediğiniz anlamına gelir. Ancak bu Android'e özgü bir ipucu değil ve yine de çok nadir bir tasarım hatası.
Elliott Hughes

17
bu belge güncel hem de Thierry-DimitriRoy @? Özellikle, Android'de enums kullanmaktan kesinlikle kaçınmalısınız.
Jacob Tabak


11
Verdiğiniz bağlantı öldü.
Terry

26

Bir tahmin:

  • Hummingbird ve Snapdragon gibi Gigahertz CPU'lar artık yaygındır ve Dalvik VM'yi başlangıçta kısıtlayan küçük kodlu küçük bellek gereksinimleri artık doğru değildir.
  • Her nakliye cihazı JIT kullanır (2.2'ye yeni). Enum'un sınıf başlatıcısı daha hızlı çalışır, değerler JIT-zaman sabitleri olarak kabul edilebilir ve JIT enum sınıflarını düzene koymak için özel bir desteğe sahip olabilir.
  • Performansa gerçekten duyarlı olan kod , Android 1.5 yayınlandığında hala yeni ve cilasız olan NDK'yı kullanıyor. 2.3'teki NDK, neredeyse tamamen yönetilmeyen oyunlara izin veren yerel etkinlikleri desteklemektedir.

Bu nedenle, bir GUI uygulamasının nispeten sıradan gereksinimleri için, numaralandırmaların geliştirme zamanı faydaları ekstra çalışma zamanı maliyetinden çok daha fazladır.


23

Elliott Hughes, blogunda yeniden yazma hakkında daha fazla ayrıntı sunuyor: http://elliotth.blogspot.com/2010/09/java-benchmarks.html

Gönderinin ikinci yarısı, Performans belgesindeki her iddianın artık kıyaslamalarla desteklendiğini açıklıyor. Dokümanın önceki sürümleri, görünüşe göre "Çok pahalı oldukları için numaralardan kaçının" gibi doğrulanmamış iddialar içeriyordu.


Sadece Elliott'un kabul edilen cevabını bu linkle desteklemek istedim.
jkooker

12

Elliot Hugues'un 2011 cevabı, numaralandırmadan kaçınmanın asıl nedeninin "işlem performansı" nda olduğu gibi performans nedeni olduğunu söyledi. Bu sebep aslında desteklenmediği için resmi belgelerden kaldırılmıştır.

Daha sonra eklenmiştir, çünkü numaralandırmalar tamsayı kullanmaktan çok daha fazla veri ekler.


2
Buna ek olarak Google adamları IntDef, int sabitlerini Android Studio hataları ve uyarısıyla güvenle kullanmanıza izin veren ek açıklamalar sundu . blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.

9

TLDR: Dalvik bellek ayırmada iyi değildi ve Enumdaha fazla bellek kullanıyor int. Android Lollipop, Dalvik'i aynı sınırlamalardan muzdarip olmayan ART ile değiştirdi. Dolayısıyla bu öneri artık geçerli değildir.

Uzun cevap:

Vaov! 8 yıl, 5 cevap ve birçok yorum sonra gerçek neden hala ele alınmamıştır.

Lolipop öncesi Android günlerinde Dalvik, VM'nin kullandığı süreçti. Bu süre zarfında uygulamaların kullanabileceği az miktarda bellek bulunduğundan, Dalvik'in çok fazla bellek kısıtlaması vardı. Bellek tahsisi için Dalvik yığını yürümek ve yer bulmak zorunda kaldı. Öbek ayrıca zamanla parçalanır. Dalvik birleştiremedi, bu yüzden zamanla tahsis eder ve sonunda yer kalmaz.

Yalnızca İçeri İhtiyacınız Olan Numaralandırmalardan Kaçının

bir Dalvik gün gelir çünkü bir Enumbir çok daha büyük intve bellek ayırma çok pahalı.

Bugün hızlı bir şekilde ilerleyen Dalvik'in yerini ART aldı. ART KitKat'ta çıktı ve Lollipop'tan beri varsayılan.

ART, hafızayı optimize etmek için değil, performans için optimize etmek için oluşturuldu. Ayrıca tahsisler ve koleksiyonlar için optimize edilmiştir. Bunun nedeni, büyük nesneler için ayrılmış bir belleğe sahip olmasıdır. ART, her şeyi aynı öbeğe koymak ve sonra tüm minik nesnelerin arasında büyük nesneler için yer bulmak yerine, tüm büyük nesneleri ve bitmap'leri ayrı bir yığın haline getirir. Ve sonra küçük nesneler ayrı yığın halinde gider. Ayrıca birleştirebilir.

ART sonrası, EnumAndroid kullanıyorsanız umursamıyor ve bu yüzden tavsiye şimdi gitti.

Bu, Google'daki Chet Haase'den geliyor. Google I / O konuşmasını bulmanızı ve tüm videoyu izlemenizi öneririm. Android hakkında birçok yararlı bilgi ve bilgi içerir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.