Messwerte für „Schreiben“ und „Aufrufen“ vergleichen

Jetpack Compose beschleunigt die UI-Entwicklung und verbessert Android Entwicklung. Berücksichtigen Sie jedoch, das Hinzufügen von „Compose“ zu einer vorhandenen App kann sich auf Messwerte wie die APK-Größe Build- und Laufzeitleistung.

APK-Größe und Build-Dauer

In diesem Abschnitt werden die Auswirkungen auf die APK-Größe und die Build-Zeit anhand der Beispiel-App Sunflower: eine App, die Best Practices demonstriert eine auf Ansichten basierende App zu Compose migrieren.

APK-Größe

Wenn du deinem Projekt Bibliotheken hinzufügst, wird das APK größer. Die folgenden Ergebnisse sind für das reduzierte Release-APK jedes Projekts mit Ressource und Code bestimmt Verkleinerung aktiviert, im R8-Vollmodus und mit APK Analyzer gemessen.

Lesemodus Gemischte Ansichten und Kompositionen Schreibgeschützt
Downloadgröße 2.252 KB 3.034 KB 2.966 KB

Beim ersten Hinzufügen von Compose in Sunflower wurde die APK-Größe von 2.252 KB auf 3.034 KB – eine Steigerung um 782 KB. Das generierte APK bestand aus dem UI-Build mit eine Mischung aus Ansichten und Text. Dieser Anstieg ist zu erwarten, wurden Sunflower hinzugefügt.

Wenn Sunflower hingegen zu einer reinen Schreib-App migriert wurde, von 3.034 KB auf 2.966 KB reduziert – eine Verringerung um 68 KB. Diese Verringerung war fällig um nicht verwendete View-Abhängigkeiten zu entfernen, z. B. AppCompat und ConstraintLayout.

Build-Zeit

Wenn Sie „Compose“ hinzufügen, verlängert sich die Erstellungszeit Ihrer App als Compose-Compiler die zusammensetzbaren Funktionen in Ihrer App verarbeitet. Die folgenden Ergebnisse wurden mit dem gradle-profiler-Tool, das einen Build mehrmals ausführt, dass eine durchschnittliche Build-Zeit für die Debug-Build-Dauer abgerufen werden kann, Sonnenblume:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
Lesemodus Gemischte Ansichten und Kompositionen Schreibgeschützt
Durchschnittliche Build-Dauer 299,47 ms 399,09 ms 342,16 ms

Beim ersten Hinzufügen von Compose zu Sunflower wurde die durchschnittliche Build-Zeit von 299 erhöht ms auf 399 ms – ein Anstieg um 100 ms. Diese Dauer ist auf den Compose-Compiler zurückzuführen. Weitere Aufgaben ausführen, um den im Projekt definierten Compose-Code zu transformieren

Umgekehrt sank die durchschnittliche Build-Zeit auf 342 ms, was eine Verkürzung von 57 ms darstellt, wenn Die Migration von Sunflower zu Compose wurde abgeschlossen. Diese Reduzierung kann auf mehrere Faktoren berücksichtigen, die gemeinsam die Build-Dauer reduzieren, wie z. B. das Entfernen von Daten Bindung, Migration von Abhängigkeiten, die kapt zu KSP verwenden, und Aktualisieren von verschiedene Abhängigkeiten auf ihre neueste Version zu aktualisieren.

Zusammenfassung

Durch die Einführung von „Compose“ wird die APK-Größe deiner App die Build-Dauer Ihrer App aufgrund des Kompilierungsprozesses erhöhen „Code schreiben“. Diese Kompromisse müssen jedoch gegen die Vorteile von Compose, insbesondere im Hinblick auf die Steigerung der Entwicklerproduktivität wenn Sie die Funktion „Schreiben“ verwenden. Das Play Store-Team fand beispielsweise heraus, dass das Schreiben einer UI viel weniger Code erfordert, manchmal bis zu 50%. die Produktivität und Verwaltbarkeit von Code erhöhen.

Weitere Fallstudien finden Sie unter Compose für Teams verwenden.

Laufzeitleistung

In diesem Abschnitt werden Themen zur Laufzeitleistung in Jetpack Compose behandelt, wie Jetpack Compose im Vergleich zur Leistung des View-Systems abschneidet, und wie Sie sie messen können.

Intelligente Neuzusammensetzungen

Wenn Teile der Benutzeroberfläche ungültig sind, versucht Compose, nur die die aktualisiert werden müssen. Weitere Informationen hierzu finden Sie im Lebenszyklus von zusammensetzbare Funktionen und Jetpack Compose Dokumentation zu den einzelnen Phasen.

Referenzprofile

Baseline-Profile sind ein eine hervorragende Möglichkeit, gängige User Journeys zu beschleunigen. Referenzwert einfügen Ein Profil in Ihrer App kann die Geschwindigkeit der Codeausführung um etwa 30 % indem Sie Interpretation und Just-in-Time-Kompilierung Codepfade enthalten.

Die Jetpack Compose-Bibliothek enthält ein eigenes Baseline-Profil Diese Optimierungen werden automatisch angewendet, wenn Sie die Funktion „Schreiben“ in Ihrer App verwenden. Sie können jedoch Diese Optimierungen wirken sich nur auf Codepfade innerhalb der Compose-Bibliothek aus. empfehlen, ein Baseline-Profil hinzuzufügen. können Sie Codepfade außerhalb von Compose abdecken.

Vergleich mit dem Datenansichtssystem

Jetpack Compose hat im Vergleich zum Ansichtssystem viele Verbesserungen. Diese Verbesserungen werden in den folgenden Abschnitten beschrieben.

Alles erweitert die Ansicht

Jede View, die auf den Bildschirm gezeichnet wird, z. B. TextView, Button oder ImageView, erfordert Arbeitsspeicherzuweisungen, explizite Statusverfolgung und verschiedene Callbacks für alle Anwendungsfälle. Darüber hinaus benötigt der kundenspezifische View-Eigentümer zur Implementierung expliziter Logik, um das erneute Zeichnen zu verhindern, die für die wiederholte Datenverarbeitung erforderlich sind.

Jetpack Compose bietet mehrere Möglichkeiten, dieses Problem zu beheben. Schreiben enthält keine expliziten Elemente aktualisierbare Objekte zum Zeichnen von Ansichten. UI-Elemente sind einfache zusammensetzbare Funktionen dessen Informationen auf wiederholbare Weise in die Komposition geschrieben werden. Das hilft, die explizite Statusverfolgung, Speicherzuweisungen und Rückrufe nur auf die zusammensetzbare Funktionen, die diese Funktionen und nicht alle Erweiterungen eines bestimmten View-Typs.

Außerdem bietet „Compose“ intelligente Neuzusammensetzungen, und wiederholen das zuvor gezeichnete Ergebnis erneut, wenn Sie keine Änderungen vornehmen müssen.

Mehrere Layout-Pässe

Herkömmliche ViewGroups haben eine Menge Ausdruckskraft in Bezug auf Maß und Layout APIs, die sie anfällig für mehrere Layout-Durchläufe machen. Diese mehrfachen Layouts Durchläufe können an bestimmten verschachtelten Punkten in der Ansicht zu exponentiellen Ergebnissen führen. Hierarchie.

Jetpack Compose erzwingt einen einzelnen Layout-Pass für alle zusammensetzbaren Layouts über den zugehörigen API-Vertrag. Dadurch kann das Schreiben effizient erfolgen mit tiefen UI-Baumstrukturen arbeiten. Wenn mehrere Messungen erforderlich sind, intrinsische Messungen.

Startleistung ansehen

Das View-System muss XML-Layouts künstlich in die Höhe treiben, wenn ein bestimmtes Layout angezeigt wird zum ersten Mal. Diese Kosten werden in Jetpack Compose eingespart, da Layouts die in Kotlin geschrieben und wie der Rest Ihrer App kompiliert wurden.

Benchmark-Erstellung

In Jetpack Compose 1.0 gibt es nennenswerte Leistungsunterschiede zwischen eine App im debug- und release-Modus Für repräsentative Zeiten: immer Verwenden Sie bei der Profilerstellung für Ihre Anwendung den Build release anstelle von debug.

Um die Leistung Ihres Jetpack Compose-Codes zu überprüfen, können Sie den Jetpack MacroBenchmark-Bibliothek Weitere Informationen Informationen zur Verwendung mit Jetpack Compose finden Sie in der MacroBenchmarkSample-Projekt:

Das Jetpack Compose-Team nutzt außerdem MacroBenchmark, um Regressionen zu erkennen, passieren kann. Sehen Sie sich zum Beispiel die Benchmark für Lazy-Spalten an. und das Dashboard um Regressionen zu verfolgen.

Installation des Profils erstellen

Da es sich bei Jetpack Compose um eine entbündelte Bibliothek handelt, profitiert sie nicht von Zygote, das die UI Toolkit-Klassen und Drawables Jetpack Compose 1.0 verwendet Profil Installation für Release-Builds. Profilinstallationen ermöglichen Apps, wichtigen Code für die bei der Installation vorab kompiliert werden. Compose sendet das Profil Installationsregeln, die die Startzeit und Verzögerungen in Compose-Apps reduzieren.