Pourquoi l'option "Éviter les énumérations là où vous n'avez besoin que d'Ints" a-t-elle été supprimée des conseils de performance d'Android?

175

La section «Éviter les énumérations là où vous n'avez besoin que d'Ints» a été supprimée de la documentation officielle du développeur . (Voir Pourquoi Android n'utilise-t-il pas plus d'énumérations? Pour l'ancien contenu de la section)

Pourquoi? Y a-t-il eu un changement dans la VM Android qui a rendu le conseil obsolète?

Thierry-Dimitri Roy
la source
2
Pour référence, voici le bytecode décompilé pour l'exemple Shrubbery: https://gist.github.com/847418
Josh Lee
15
En mars 2014, la page suivante contient toujours des conseils contre l'utilisation des énumérations: developer.android.com/training/articles/memory.html#Overhead
Tahir Akhtar
2
Un an plus tard, comme le disait @TahirAkhtar, la formation officielle sur Android dit toujours: "Vous devez strictement éviter d'utiliser les énumérations sur Android."
LarsH
1
Il est intéressant de noter que la recommandation d'éviter l'énumération se trouve dans cet article de 2015 d'un développeur Android principal: medium.com/google-developers/ ... Aussi: "Notez que l'utilisation de l'annotation @IntDef, qui est prise en charge par Android Studio et Gradle 1.3+, donnera à votre code une sécurité de type au moment de la construction (lorsque les erreurs de charpie sont activées), tout en conservant les avantages de taille et de performances de l'utilisation des variables int. "
tonylo
4
Depuis avril 2018, la page suivante ne contient plus de conseils contre l'utilisation des énumérations. developer.android.com/topic/performance/memory#Overhead
Robin Davies

Réponses:

157

la version originale de ce document n'était qu'un tas de préjugés. il a été réécrit pour ne contenir que des faits sauvegardés par des benchmarks réels, et il est mis à jour au fur et à mesure que la VM est mise à jour. vous pouvez trouver les différents benchmarks - ainsi que certains des benchmarks que nous utilisons pour optimiser les bibliothèques principales - à l' adresse http://code.google.com/p/dalvik/ .

Elliott Hughes
la source
35
Cela vous aiderait si vous listiez vos informations d'identification dans votre profil SO. Il m'a fallu un peu de fouille. Mais maintenant que je vois que vous semblez travailler dans l'équipe VM, j'accepterai votre réponse comme réponse officielle. :)
Thierry-Dimitri Roy
25
L'ajout d'une classe enum signifie bien sûr que votre application contient une classe supplémentaire, ce n'est donc pas gratuit , mais nous devons supposer qu'un développeur ajoute uniquement des énumérations là où elles sont utiles. La seule très mauvaise utilisation que j'ai vue d'énumérations était dans un code d'harmonie où ils voulaient vraiment des ints (pour les bitmasks et autres) et le "enum" n'était pas une énumération dans un sens raisonnable. Si vous vous surprenez à appeler souvent "ordinal ()", c'est probablement une mauvaise odeur qui signifie que vous ne voulez pas d'énumération. Mais ce n'est pas une astuce spécifique à Android, et c'est de toute façon une erreur de conception vraiment rare.
Elliott Hughes
17
Ce document est- il également périmé @ Thierry-DimitriRoy? Plus précisément, vous devez strictement éviter d'utiliser des énumérations sur Android.
Jacob Tabak
3
FWIW, Proguard transformera les énumérations en entiers par défaut.
Nacho Coloma
11
Le lien que vous avez donné est mort.
Terry
26

Un invité:

  • Les processeurs Gigahertz comme Hummingbird et Snapdragon sont désormais courants, et les exigences de petit code en petite mémoire qui limitaient à l'origine la VM Dalvik ne sont plus aussi vraies.
  • Chaque appareil d'expédition utilise le JIT (nouveau à 2.2). L'initialiseur de classe de l'énumération s'exécutera plus rapidement, les valeurs pourraient être traitées comme des constantes de temps JIT et le JIT pourrait bien avoir un support spécial pour la rationalisation des classes d'énumération.
  • Le code qui est vraiment sensible aux performances utilise le NDK, qui était encore nouveau et non poli lors de la sortie d'Android 1.5. Le NDK dans 2.3 prend en charge les activités natives, ce qui permet des jeux presque entièrement non gérés.

Ainsi, pour les exigences relativement banales d'une application GUI, les avantages des enums en termes de développement sur le temps dépassent largement le coût d'exécution supplémentaire.

Josh Lee
la source
23

Elliott Hughes offre plus de détails sur la réécriture de la documentation sur son blog: http://elliotth.blogspot.com/2010/09/java-benchmarks.html

La seconde moitié de l'article explique que chaque réclamation sur le document Performance est désormais étayée par des benchmarks. Les versions précédentes du document contenaient apparemment des affirmations non vérifiées, telles que «Évitez les énumérations car elles sont trop chères».

jkooker
la source
Je voulais juste compléter la réponse acceptée d'Elliott avec ce lien.
jkooker
12

La réponse d'Elliot Hugues en 2011 a déclaré que la raison initiale pour éviter l'énumération était pour des raisons de performance ... comme dans la "performance de traitement". Cette raison n'étant pas étayée par des faits, elle a été supprimée de la documentation officielle.

Il a été ajouté plus tard car les énumérations ajoutent beaucoup plus de données en mémoire que l'utilisation d'entiers.

Thierry-Dimitri Roy
la source
2
De plus, les gars de Google ont introduit des IntDefannotations, qui permettent d'utiliser les constantes int en toute sécurité avec les erreurs et les avertissements d'Android Studio. blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.
9

TLDR: Dalvik n'était pas bon avec l'allocation de mémoire et Enumutilise plus de mémoire que int. Android Lollipop a remplacé Dalvik par ART qui ne souffre pas des mêmes limitations. Cette recommandation n'est donc plus pertinente.

La réponse longue:

Hou la la! 8 ans, 5 réponses et de nombreux commentaires plus tard, la vraie raison n'est toujours pas abordée.

À l'époque d'Android pré-sucette, Dalvik était le processus VM utilisé. Comme une petite quantité de mémoire était disponible pour les applications à utiliser pendant cette période, Dalvik avait beaucoup de contraintes de mémoire. Pour l'allocation de mémoire, Dalvik a dû parcourir le tas et trouver de l'espace. Heap serait également fragmenté au fil du temps. Dalvik ne pouvait pas défragmenter, donc il allouerait au fil du temps et finirait par manquer d'espace.

Évitez les énumérations là où vous n'avez besoin que d'Ints

vient de l'époque de Dalvik car un Enumest beaucoup plus gros qu'un intet l'allocation de mémoire était très chère.

Aujourd'hui, Dalvik a été remplacé par ART. ART est sorti dans KitKat et est par défaut depuis Lollipop.

ART a été créé dès le départ non pas pour optimiser la mémoire mais pour optimiser les performances. Il est également optimisé pour les allocations et les collections. La raison en est que la mémoire est réservée aux gros objets. Au lieu de tout mettre dans le même tas, puis de devoir trouver de l'espace pour les gros objets parmi tous les petits, ART met tous les gros objets et les bitmaps dans un tas séparé. Et puis les petits objets vont dans le tas séparé. En outre, il peut défragmenter.

Après ART, si vous utilisez EnumAndroid, ça ne fait rien et c'est pourquoi la recommandation a disparu maintenant.

Cela vient de Chet Haase chez Google. Je recommande de trouver son discours Google I / O et de regarder toute la vidéo. Il contient de nombreuses informations utiles et un aperçu d'Android.

Adeel Ahmad
la source