Warum wurde "Vermeiden Sie Aufzählungen, bei denen Sie nur Ints benötigen" aus den Leistungstipps von Android entfernt?

175

Der Abschnitt "Vermeiden Sie Aufzählungen, bei denen Sie nur Ints benötigen" wurde aus der offiziellen Entwicklerdokumentation entfernt . (Siehe Warum verwendet Android nicht mehr Aufzählungen? Für den Inhalt des alten Abschnitts)

Warum? Gab es eine Änderung in der Android-VM, die den Tipp überflüssig machte?

Thierry-Dimitri Roy
quelle
2
Als Referenz ist hier der dekompilierte Bytecode für das Shrubbery-Beispiel: https://gist.github.com/847418
Josh Lee
15
Ab März 2014 enthält die folgende Seite noch Ratschläge gegen die Verwendung von Aufzählungen: developer.android.com/training/articles/memory.html#Overhead
Tahir Akhtar
2
Ein Jahr später, wie @TahirAkhtar sagte, heißt es im offiziellen Android-Training immer noch: "Sie sollten die Verwendung von Aufzählungen auf Android strikt vermeiden."
LarsH
1
Interessant zu erwähnen ist die Empfehlung zur Vermeidung von Enum in diesem Artikel von 2015 eines führenden Android-Entwicklers: medium.com/google-developers/…. Außerdem: "Beachten Sie, dass die Verwendung der Annotation @IntDef, die von Android Studio und Gradle 1.3+ unterstützt wird, Dies gibt Ihrem Code Sicherheit beim Erstellen (wenn Flusenfehler aktiviert sind), während die Größen- und Leistungsvorteile der Verwendung von int-Variablen erhalten bleiben. "
Tonylo
4
Ab April 2018 enthält die folgende Seite keine Hinweise mehr zur Verwendung von Aufzählungen. developer.android.com/topic/performance/memory#Overhead
Robin Davies

Antworten:

157

Die Originalversion dieses Dokuments war nur eine Reihe von Vorurteilen. Es wurde so umgeschrieben, dass es nur Fakten enthält, die durch tatsächliche Benchmarks gesichert sind, und es wird aktualisiert, wenn die VM aktualisiert wird. Die verschiedenen Benchmarks sowie einige der Benchmarks, mit denen wir die Kernbibliotheken optimieren, finden Sie unter http://code.google.com/p/dalvik/ .

Elliott Hughes
quelle
35
Es wäre hilfreich, wenn Sie Ihre Anmeldeinformationen in Ihrem SO-Profil auflisten würden. Ich musste ein bisschen herumgraben. Aber jetzt, da ich sehe, dass Sie anscheinend im VM-Team arbeiten, akzeptiere ich Ihre Antwort als offizielle Antwort. :)
Thierry-Dimitri Roy
25
Das Hinzufügen einer Aufzählungsklasse bedeutet natürlich, dass Ihre App eine zusätzliche Klasse enthält, daher ist sie nicht kostenlos . Wir müssen jedoch davon ausgehen, dass ein Entwickler Aufzählungen nur dort hinzufügt, wo sie nützlich sind. Die einzige wirklich schlechte Verwendung, die ich von Aufzählungen gesehen habe, war in einem Harmonie-Code, in dem sie wirklich Ints wollten (für Bitmasken und dergleichen), und die "Aufzählung" war keine Aufzählung in einem vernünftigen Sinne. Wenn Sie häufig "ordinal ()" nennen, ist das wahrscheinlich ein schlechter Geruch, der bedeutet, dass Sie keine Aufzählung wünschen. Aber das ist kein Android-spezifischer Tipp, und es ist sowieso ein wirklich seltener Designfehler.
Elliott Hughes
17
Ist dieses Dokument auch bei Thierry-DimitriRoy veraltet? Insbesondere sollten Sie die Verwendung von Aufzählungen unter Android strikt vermeiden.
Jacob Tabak
3
FWIW, Proguard wandelt Enums standardmäßig in Ints um.
Nacho Coloma
11
Der Link, den Sie gegeben haben, ist tot.
Terry
26

Eine Annahme:

  • Gigahertz-CPUs wie Hummingbird und Snapdragon sind mittlerweile weit verbreitet, und die Anforderungen an kleinen Speicher mit kleinem Code, die ursprünglich die Dalvik-VM einschränkten, sind nicht mehr so ​​wahr.
  • Jedes Versandgerät verwendet die JIT (neu in 2.2). Der Klasseninitialisierer der Aufzählung wird schneller ausgeführt, die Werte werden möglicherweise als JIT-Zeitkonstanten behandelt, und die JIT unterstützt möglicherweise speziell die Optimierung von Aufzählungsklassen.
  • Code, der wirklich leistungsempfindlich ist, verwendet das NDK, das zum Zeitpunkt der Veröffentlichung von Android 1.5 noch neu und unpoliert war. Das NDK in 2.3 unterstützt native Aktivitäten, die nahezu vollständig nicht verwaltete Spiele ermöglichen.

Für die vergleichsweise alltäglichen Anforderungen einer GUI-App überwiegen die Vorteile von Aufzählungen für die Entwicklungszeit bei weitem die zusätzlichen Laufzeitkosten.

Josh Lee
quelle
23

Elliott Hughes bietet in seinem Blog weitere Informationen zum Umschreiben der Dokumentation: http://elliotth.blogspot.com/2010/09/java-benchmarks.html

In der zweiten Hälfte des Beitrags wird erläutert, dass jeder Anspruch auf das Leistungsdokument jetzt mit Benchmarks gesichert wird. Frühere Versionen des Dokuments enthielten offenbar nicht überprüfte Behauptungen wie "Vermeiden Sie Aufzählungen, weil sie zu teuer sind."

jkooker
quelle
Ich wollte nur Elliotts akzeptierte Antwort mit diesem Link ergänzen.
Jkooker
12

In der Antwort von Elliot Hugues aus dem Jahr 2011 heißt es, dass der ursprüngliche Grund für die Vermeidung von Aufzählungen der Leistungsgrund war ... wie bei "Verarbeitungsleistung". Da dieser Grund nicht durch Tatsachen gestützt wurde, wurde er aus der offiziellen Dokumentation entfernt.

Es wurde später hinzugefügt, da Aufzählungen viel mehr Daten im Speicher hinzufügen als Ganzzahlen.

Thierry-Dimitri Roy
quelle
2
Zusätzlich haben Google-Leute IntDefAnmerkungen eingeführt , mit denen int-Konstanten sicher mit den Fehlern und Warnungen von Android Studio verwendet werden können. blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.
9

TLDR: Dalvik war nicht gut mit Speicherzuweisung und Enumverwendet mehr Speicher als int. Android Lollipop ersetzte Dalvik durch ART, das nicht unter den gleichen Einschränkungen leidet. Somit ist diese Empfehlung nicht mehr relevant.

Die lange Antwort:

Beeindruckend! 8 Jahre, 5 Antworten und viele Kommentare später wird der wahre Grund immer noch nicht angesprochen.

In den Android-Tagen vor dem Lutscher war Dalvik die verwendete Prozess-VM. Da während dieser Zeit nur wenig Speicher für Anwendungen zur Verfügung stand, hatte Dalvik viele Speicherbeschränkungen. Für die Speicherzuweisung musste Dalvik über den Haufen gehen und Platz finden. Der Haufen würde auch mit der Zeit fragmentiert werden. Dalvik konnte nicht defragmentieren, so dass es sich im Laufe der Zeit zuordnete und schließlich keinen Platz mehr hatte.

Vermeiden Sie Aufzählungen, bei denen Sie nur Ints benötigen

kommt aus Dalvik-Tagen, weil ein Enumviel größer ist als einint und die Speicherzuweisung sehr teuer war.

Dalvik wurde heute durch ART ersetzt. ART wurde in KitKat veröffentlicht und ist seit Lollipop Standard.

ART wurde von Grund auf entwickelt, um nicht den Speicher, sondern die Leistung zu optimieren. Es ist auch für Zuordnungen und Sammlungen optimiert. Der Grund dafür ist, dass Speicher für große Objekte reserviert ist. Anstatt alles auf den gleichen Haufen zu legen und dann Platz für große Objekte inmitten all der kleinen zu finden, legt ART alle großen Objekte und Bitmaps in einem separaten Haufen ab. Und dann gehen die kleinen Objekte in den separaten Haufen. Auch kann es defragmentieren.

Nach ART ist Enumes egal , ob Sie Android verwenden, und deshalb ist die Empfehlung jetzt weg.

Dies kommt von Chet Haase bei Google. Ich empfehle, sein Google I / O-Gespräch zu finden und das gesamte Video anzusehen. Es enthält viele nützliche Informationen und Einblicke in Android.

Adeel Ahmad
quelle