¿Por qué se eliminó "Evitar enumeraciones donde solo necesita Ints" de los consejos de rendimiento de Android?

175

La sección "Evitar enumeraciones donde solo necesita" se eliminó de la documentación oficial del desarrollador . (Consulte ¿Por qué Android no usa más enumeraciones? Para el contenido de la sección anterior)

¿Por qué? ¿Hubo un cambio en la máquina virtual de Android que hizo que la punta quedara obsoleta?

Thierry-Dimitri Roy
fuente
2
Como referencia, aquí está el bytecode descompilado para el ejemplo de Shrubbery: https://gist.github.com/847418
Josh Lee
15
A partir de marzo de 2014, la siguiente página aún contiene consejos contra el uso de enumeraciones: developer.android.com/training/articles/memory.html#Overhead
Tahir Akhtar
2
Un año después, como dijo @TahirAkhtar, la capacitación oficial de Android aún dice "Deberías evitar estrictamente el uso de enumeraciones en Android".
LarsH
1
Es interesante observar que la recomendación para evitar la enumeración se encuentra en este artículo de 2015 de un desarrollador principal de Android: medium.com/google-developers/… También: "Tenga en cuenta que al usar la anotación @IntDef, que es compatible con Android Studio y Gradle 1.3+, le dará seguridad al tipo de código de tiempo de construcción (cuando los errores de pelusa están habilitados), al tiempo que conserva los beneficios de tamaño y rendimiento del uso de variables int ".
tonylo
44
A partir de abril de 2018, la siguiente página ya no contiene consejos sobre el uso de enumeraciones. developer.android.com/topic/performance/memory#Overhead
Robin Davies

Respuestas:

157

La versión original de ese documento era solo un montón de prejuicios. se ha reescrito para contener solo hechos respaldados por puntos de referencia reales, y se actualiza a medida que se actualiza la VM. Puede encontrar los diversos puntos de referencia, además de algunos de los puntos de referencia que utilizamos para optimizar las bibliotecas principales, en http://code.google.com/p/dalvik/ .

Elliott Hughes
fuente
35
Sería útil que enumerara sus credenciales en su perfil SO. Me llevó un poco de investigación. Pero ahora que veo que parece que trabajas en el equipo de VM, aceptaré tu respuesta como la respuesta oficial. :)
Thierry-Dimitri Roy
25
Agregar una clase de enumeración significa, por supuesto, que su aplicación contiene una clase adicional, por lo que no es gratuita , pero debemos suponer que un desarrollador solo agrega enumeraciones cuando son útiles. El único uso realmente malo que he visto de las enumeraciones fue en algún código de armonía donde realmente querían entradas (para máscaras de bits y similares) y la "enumeración" no era una enumeración en ningún sentido razonable. Si te encuentras llamando "ordinal ()" mucho, probablemente sea un mal olor que significa que no quieres una enumeración. Pero ese no es un consejo específico para Android, y de todos modos es un error de diseño realmente raro.
Elliott Hughes
17
¿ Este documento también está desactualizado @ Thierry-DimitriRoy? Específicamente, debe evitar estrictamente el uso de enumeraciones en Android.
Jacob Tabak
3
FWIW, Proguard transformará enumeraciones en entradas por defecto.
Nacho Coloma
11
El enlace que diste está muerto.
Terry
26

Una adivinanza:

  • Las CPU de Gigahertz como Hummingbird y Snapdragon ahora son comunes, y los requisitos de memoria pequeña de código pequeño que originalmente restringían la máquina virtual Dalvik ya no son tan ciertos.
  • Todos los dispositivos de envío utilizan el JIT (nuevo en 2.2). El inicializador de la clase enum se ejecutará más rápido, los valores podrían tratarse como constantes de tiempo JIT y el JIT podría tener un soporte especial para racionalizar las clases enum.
  • El código que es realmente sensible al rendimiento utiliza el NDK, que todavía era nuevo y sin pulir cuando se lanzó Android 1.5. El NDK en 2.3 admite actividades nativas, lo que permite juegos casi no administrados.

Por lo tanto, para los requisitos comparativamente mundanos de una aplicación GUI, los beneficios en tiempo de desarrollo de las enumeraciones superan con creces el costo de tiempo de ejecución adicional.

Josh Lee
fuente
23

Elliott Hughes ofrece más detalles sobre la reescritura de documentación en su blog: http://elliotth.blogspot.com/2010/09/java-benchmarks.html

La segunda mitad de la publicación explica que cada reclamo en el documento Performance ahora está respaldado con puntos de referencia. Las versiones anteriores del documento aparentemente contenían afirmaciones no verificadas, como "Evita enumeraciones porque son demasiado caras".

jkooker
fuente
Solo quería complementar la respuesta aceptada de Elliott con este enlace.
jkooker
12

La respuesta de 2011 de Elliot Hugues dijo que la razón original para evitar la enumeración era por razones de rendimiento ... como en "procesamiento de rendimiento". Como esta razón no estaba respaldada por hechos, se eliminó de la documentación oficial.

Se ha agregado más adelante porque las enumeraciones agregan muchos más datos en la memoria que el uso de enteros.

Thierry-Dimitri Roy
fuente
2
Además, los chicos de Google introdujeron IntDefanotaciones, que permiten usar constantes int de forma segura con los errores y advertencias de Android Studio. blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.
9

TLDR: Dalvik no era bueno con la asignación de memoria y Enumusa más memoria que int. Android Lollipop reemplazó a Dalvik con ART, que no sufre las mismas limitaciones. Por lo tanto, esta recomendación ya no es relevante.

La respuesta larga:

¡Guauu! 8 años, 5 respuestas y muchos comentarios después, la verdadera razón aún no se aborda.

En los días de Android previos a la piruleta, Dalvik era el proceso que usaba VM. Como había una pequeña cantidad de memoria disponible para que las aplicaciones la usaran durante ese tiempo, Dalvik tenía muchas restricciones de memoria. Para la asignación de memoria, Dalvik tuvo que recorrer el montón y encontrar espacio. El montón también se fragmentaría con el tiempo. Dalvik no pudo desfragmentar, por lo que se asignaría con el tiempo y, finalmente, se quedaría sin espacio.

Evite enumeraciones donde solo necesita

proviene de los días de Dalvik porque una Enumes mucho más grande que una inty la asignación de memoria era muy costosa.

Avance rápido hoy, Dalvik ha sido reemplazado por ART. ART salió en KitKat y es predeterminado desde Lollipop.

ART fue creado desde cero no para optimizar la memoria sino para optimizar el rendimiento. También está optimizado para asignaciones y colecciones. La razón es que tiene memoria reservada para objetos grandes. En lugar de poner todo en el mismo montón, y luego tener que encontrar espacio para objetos grandes en medio de todos los pequeños, ART coloca todos los objetos grandes y mapas de bits en un montón separado. Y luego los objetos pequeños van en el montón separado. También se puede desfragmentar.

Después de ART, si usa EnumAndroid no le importa y es por eso que la recomendación ya no existe.

Esto viene de Chet Haase en Google. Recomiendo encontrar su charla de E / S de Google y ver el video completo. Contiene mucha información útil e información sobre Android.

Adeel Ahmad
fuente