177 votes

Pourquoi le conseil "Évitez les Enums lorsque vous n'avez besoin que d'Ints" a-t-il été supprimé des conseils de performance d'Android ?

La section "Avoid Enums Where You Only Need Ints" a été supprimée de la version officielle de l'article. documentation pour les développeurs . (Voir Pourquoi Android n'utilise-t-il pas plus d'enums ? pour le contenu de l'ancienne section)

Pourquoi ? Y a-t-il eu un changement dans la VM Android qui a rendu l'astuce obsolète ?

0 votes

Excellente question, bien repérée. J'ai évité d'utiliser les enums dans mon code spécifiquement à cause de la recommandation de performance qui figurait dans les documents.

2 votes

Pour référence, voici le décompilé pour l'exemple Shrubbery : https://gist.github.com/847418

15 votes

En mars 2014, la page suivante contient toujours des conseils contre l'utilisation des enums : developer.Android.com/training/articles/memory.html#Overhead

159voto

Elliott Hughes Points 3138

La version originale de ce document n'était qu'un ramassis de préjugés. il a été réécrit pour ne contenir que des faits étayé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 de base -- à l'adresse suivante http://code.google.com/p/dalvik/ .

35 votes

Il serait utile que vous indiquiez vos références dans votre profil SO. J'ai dû faire quelques recherches. Mais maintenant que je vois que vous semblez travailler dans l'équipe VM, j'accepte votre réponse comme réponse officielle :)

2 votes

@Elliott Hughes - cela signifie que la thèse sur les Enums ne peut pas être prouvée, ou qu'elle est fausse ?

25 votes

L'ajout d'une classe d'énumération signifie bien sûr que votre application contient une classe supplémentaire. gratuit mais nous devons supposer qu'un développeur n'ajoute des enums que lorsqu'ils sont utiles. La seule utilisation vraiment mauvaise que j'ai vue des enums était dans un code d'harmonie où l'on voulait vraiment des ints (pour les bitmasks et autres) et où l'"enum" n'était pas un enum dans un sens raisonnable. Si vous vous retrouvez à appeler souvent "ordinal()", c'est probablement une mauvaise odeur qui signifie que vous ne voulez pas d'un enum. Mais ce n'est pas un conseil spécifique à Android, et c'est une erreur de conception très rare de toute façon.

26voto

Josh Lee Points 53741

Une supposition :

  • Les processeurs Gigahertz tels que Hummingbird et Snapdragon sont désormais courants, et les exigences en matière de petits codes et de petites mémoires qui limitaient à l'origine la VM Dalvik ne sont plus aussi vraies.
  • Tous les appareils d'expédition utilisent le JIT (nouveauté de la version 2.2). L'initialisateur de la classe de l'énumération fonctionnera plus rapidement, les valeurs pourraient être traitées comme des constantes JIT-time, et le JIT pourrait bien avoir un support spécial pour rationaliser les classes d'énumération.
  • Code qui est vraiment sensible aux performances utilise le NDK, qui était encore nouveau et non perfectionné lors de la sortie d'Android 1.5. Le NDK de la version 2.3 prend en charge les activités natives, ce qui permet de créer 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 temps de développement l'emportent largement sur le coût supplémentaire en termes de temps d'exécution.

23voto

jkooker Points 379

Elliott Hughes donne 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 partie de l'article explique que chaque affirmation figurant dans le document sur les performances est désormais étayée par des critères de référence. Les versions précédentes de la documentation contenaient apparemment des affirmations non vérifiées, comme "Évitez les enums parce qu'ils sont trop chers".

0 votes

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

15voto

Adeel Ahmad Points 509

TLDR : Dalvik n'était pas très bon en matière d'allocation de mémoire et de Enum utilise 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 d'actualité.

La réponse longue :

Wow ! 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é-lollipop, Dalvik était le processus VM utilisé. Comme les applications disposaient alors d'une faible quantité de mémoire, Dalvik était soumis à de nombreuses contraintes de mémoire. Pour l'allocation de mémoire, Dalvik devait parcourir le tas et trouver de l'espace. Le tas se fragmentait également au fil du temps. Dalvik ne pouvait pas défragmenter, il allouait donc la mémoire au fil du temps et finissait par manquer d'espace.

Évitez les Enums lorsque vous n'avez besoin que d'Ints

provient des jours Dalvik car un Enum est beaucoup plus grand qu'un int et l'allocation de mémoire était très coûteuse.

Aujourd'hui, Dalvik a été remplacé par ART. ART est apparu 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. En effet, il dispose d'une mémoire réservée aux objets volumineux. Au lieu de tout mettre dans le même tas, et de devoir ensuite trouver de la place pour les gros objets parmi tous les petits, ART place tous les gros objets et les bitmaps dans un tas séparé. Les petits objets sont ensuite placés dans ce même tas. Il peut également défragmenter.

Après ART, si vous utilisez Enum Android s'en moque et c'est pourquoi la recommandation a disparu.

Cette information provient de Chet Haase, de Google. Je recommande de trouver sa présentation à la conférence Google I/O et de regarder la vidéo en entier. Elle contient beaucoup d'informations utiles et une vision d'Android.

12voto

Thierry-Dimitri Roy Points 3657

La réponse d'Elliot Hugues en 2011 indiquait que la raison initiale d'éviter les enums était une question de performance... comme dans "performance de traitement". Comme cette raison n'était pas étayée par des faits, elle a été retirée de la documentation officielle.

Il a été ajouté ultérieurement parce que les enums ajoutent beaucoup plus de données en mémoire que l'utilisation d'un nombre entier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X