Mengapa "Hindari Enums Di Mana Anda Hanya Membutuhkan Ints" dihapus dari tips kinerja Android?

175

Bagian "Hindari Enums Di Mana Anda Hanya Membutuhkan Ints" telah dihapus dari dokumentasi pengembang resmi . (Lihat Mengapa Android tidak menggunakan lebih banyak enums? Untuk konten bagian lama)

Mengapa? Apakah ada perubahan dalam VM Android yang membuat ujungnya usang?

Thierry-Dimitri Roy
sumber
2
Untuk referensi, ini adalah bytecode yang di- decompile untuk contoh Shrubbery: https://gist.github.com/847418
Josh Lee
15
Pada Maret 2014, halaman berikut masih berisi saran untuk tidak menggunakan enums: developer.android.com/training/articles/memory.html#Overhead
Tahir Akhtar
2
Setahun kemudian, seperti yang dikatakan @TahirAkhtar, pelatihan Android resmi masih mengatakan, "Anda harus benar-benar menghindari penggunaan enum di Android."
LarsH
1
Menarik untuk dicatat bahwa rekomendasi untuk menghindari enum ada dalam artikel 2015 ini dari pengembang Android utama: medium.com/google-developers/... Juga: "Perhatikan bahwa menggunakan anotasi @IntDef, yang didukung oleh Android Studio dan Gradle 1.3+, akan memberikan keamanan tipe build-time kode Anda (ketika kesalahan serat diaktifkan), sambil tetap mempertahankan manfaat ukuran dan kinerja dari penggunaan variabel int. "
tonylo
4
Pada April 2018, halaman berikut tidak lagi berisi saran untuk tidak menggunakan enum. developer.android.com/topic/performance/memory#Overhead
Robin Davies

Jawaban:

157

versi asli dari dokumen itu hanyalah banyak prasangka. itu telah ditulis ulang untuk hanya berisi fakta yang didukung oleh tolok ukur yang sebenarnya, dan diperbarui ketika VM diperbarui. Anda dapat menemukan berbagai tolok ukur - ditambah beberapa tolok ukur yang kami gunakan untuk mengoptimalkan perpustakaan inti - di http://code.google.com/p/dalvik/ .

Elliott Hughes
sumber
35
Ini akan membantu jika Anda mendaftarkan kredensial Anda di profil SO Anda. Butuh beberapa penggalian di sekitar saya. Tetapi sekarang saya melihat bahwa Anda tampaknya bekerja di tim VM, saya akan menerima jawaban Anda sebagai jawaban resmi. :)
Thierry-Dimitri Roy
25
Menambahkan kelas enum tentu saja berarti aplikasi Anda mengandung kelas tambahan, jadi tidak gratis , tetapi kami harus menganggap bahwa pengembang hanya menambahkan enum yang berguna. Satu-satunya penggunaan yang sangat buruk yang pernah saya lihat dari enum adalah dalam beberapa kode harmoni di mana mereka benar-benar menginginkan int (untuk bitmask dan sejenisnya) dan "enum" bukanlah enum dalam arti yang masuk akal. Jika Anda sering memanggil "ordinal ()", itu mungkin bau yang tidak sedap yang berarti Anda tidak ingin enum. Tapi itu bukan tip khusus Android, dan itu adalah kesalahan desain yang sangat langka.
Elliott Hughes
17
Apakah dokumen ini juga ketinggalan zaman @ Thierry-DimitriRoy? Secara khusus, Anda harus benar-benar menghindari penggunaan enum di Android.
Jacob Tabak
3
FWIW, Proguard akan mengubah enum menjadi int secara default.
Nacho Coloma
11
Tautan yang Anda berikan sudah mati.
Terry
26

Tebakan:

  • CPU Gigahertz seperti Hummingbird dan Snapdragon sekarang umum, dan persyaratan memori kecil kode kecil yang awalnya membatasi Dalvik VM tidak lagi sama benarnya.
  • Setiap perangkat pengiriman menggunakan JIT (baru ke 2.2). Inisialisasi kelas enum akan berjalan lebih cepat, nilainya mungkin diperlakukan sebagai konstanta waktu JIT, dan JIT mungkin memiliki dukungan khusus untuk merampingkan kelas enum.
  • Kode yang benar - benar peka terhadap kinerja menggunakan NDK, yang masih baru dan tidak dipoles ketika Android 1.5 dirilis. NDK in 2.3 mendukung aktivitas asli, yang memungkinkan untuk game yang hampir tidak dikelola sepenuhnya.

Jadi, untuk persyaratan yang relatif biasa dari aplikasi GUI, manfaat waktu pengembangan enum jauh lebih besar daripada biaya runtime tambahan.

Josh Lee
sumber
23

Elliott Hughes menawarkan rincian lebih lanjut tentang penulisan ulang dokumentasi di blognya: http://elliotth.blogspot.com/2010/09/java-benchmarks.html

Paruh kedua pos menjelaskan bahwa setiap klaim pada dokumen Performa sekarang didukung dengan tolok ukur. Versi sebelumnya dari dokumen tersebut ternyata berisi klaim yang tidak diverifikasi, seperti, "Hindari enum karena terlalu mahal."

jkooker
sumber
Hanya ingin menambah jawaban yang diterima Elliott dengan tautan ini.
jkooker
12

Jawaban 2011 dari Elliot Hugues mengatakan bahwa alasan awal untuk menghindari enum adalah karena alasan kinerja ... seperti dalam "kinerja pemrosesan". Karena alasan ini tidak didukung oleh fakta, itu dihapus dari dokumentasi resmi.

Ini telah ditambahkan kemudian karena enum menambahkan lebih banyak data dalam memori daripada menggunakan integer.

Thierry-Dimitri Roy
sumber
2
Selain itu Google guys memperkenalkan IntDefanotasi, yang memungkinkan untuk menggunakan konstanta int dengan aman dengan kesalahan dan peringatan Android Studio. blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.
9

TLDR: Dalvik tidak bagus dengan alokasi memori dan Enummenggunakan lebih banyak memori daripada int. Android Lollipop menggantikan Dalvik dengan ART yang tidak menderita keterbatasan yang sama. Dengan demikian rekomendasi ini tidak relevan lagi.

Jawaban panjangnya:

Wow! 8 tahun, 5 jawaban dan banyak komentar kemudian alasan sebenarnya masih belum diatasi.

Pada masa pra-lolipop Android, Dalvik adalah proses yang digunakan VM. Karena sejumlah kecil memori tersedia untuk aplikasi untuk digunakan selama waktu itu, Dalvik memiliki banyak kendala memori. Untuk alokasi memori Dalvik harus berjalan tumpukan dan menemukan ruang. Heap juga akan terfragmentasi dari waktu ke waktu. Dalvik tidak bisa defragment, sehingga akan mengalokasikan dari waktu ke waktu dan akhirnya kehabisan ruang.

Hindari Enum Dimana Anda Hanya Membutuhkan Ints

berasal dari hari-hari Dalvik karena Enumjauh lebih besar daripadaint dan alokasi memori sangat mahal.

Maju cepat hari ini, Dalvik telah digantikan oleh ART. ART keluar di KitKat dan default sejak Lollipop.

ART dibuat dari bawah ke atas bukan untuk mengoptimalkan memori tetapi untuk mengoptimalkan kinerja. Itu juga dioptimalkan untuk alokasi dan koleksi. Alasannya karena memiliki memori yang disisihkan untuk objek besar. Alih-alih meletakkan segala sesuatu di tumpukan yang sama, dan kemudian harus menemukan ruang untuk benda besar di tengah semua benda kecil, ART menempatkan semua benda besar dan bitmap di tumpukan terpisah. Dan kemudian benda-benda kecil pergi di tumpukan terpisah. Itu juga bisa defragment.

Setelah ART, jika Anda menggunakan EnumAndroid tidak peduli dan inilah sebabnya rekomendasinya hilang sekarang.

Ini datang dari Chet Haase di Google. Saya sarankan mencari Google I / O bicara dan menonton seluruh video. Ini berisi banyak informasi berguna dan wawasan tentang Android.

Adeel Ahmad
sumber