Porównanie danych tworzenia i wyświetlania

Jetpack Compose przyspiesza tworzenie interfejsu i ulepsza proces tworzenia aplikacji na Androida. Pamiętaj jednak, że dodanie Compose do istniejącej aplikacji może wpłynąć na dane, takie jak rozmiar pliku APK, kompilacja i wydajność w czasie działania.

Rozmiar pliku APK i czas kompilacji

W tej sekcji omówimy wpływ na rozmiar pliku APK i czas kompilacji na przykładzie aplikacji Sunflower, która pokazuje sprawdzone metody migracji aplikacji opartej na widokach do Compose.

Rozmiar pliku APK

Dodawanie bibliotek do projektu zwiększa rozmiar pliku APK. Poniższe wyniki dotyczą zminimalizowanych wersji pakietu APK każdego projektu z włączonym zmniejszaniem zasobów i kodu, w których użyto pełnego trybu R8 i które zostały zmierzone za pomocą APK Analyzer.

Tylko wyświetlenia Widoki mieszane i komponowanie Tylko tworzenie
Rozmiar do pobrania 2252 KB 3034 KB 2966 KB

Po pierwszym dodaniu Compose do aplikacji Sunflower rozmiar pliku APK wzrósł z 2252 KB do 3034 KB, czyli o 782 KB. Wygenerowany plik APK zawierał interfejs użytkownika utworzony z połączenia widoków i komponentów Compose. Ten wzrost jest spodziewany, ponieważ do Sunflower dodano dodatkowe zależności.

Z kolei po przeniesieniu aplikacji Sunflower do wersji opartej wyłącznie na Compose rozmiar pliku APK zmniejszył się z 3034 KB do 2966 KB, czyli o 68 KB. Spadek ten był spowodowany usunięciem nieużywanych zależności widoku, takich jak AppCompat i ConstraintLayout.

Czas tworzenia kompilacji

Dodanie biblioteki Compose wydłuża czas kompilacji aplikacji, ponieważ kompilator Compose przetwarza funkcje kompozycyjne w aplikacji. Poniższe wyniki uzyskano za pomocą samodzielnego narzędzia gradle-profiler, które wykonuje kompilację kilka razy, aby można było uzyskać średni czas kompilacji do debugowania aplikacji Sunflower:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
Tylko wyświetlenia Widoki mieszane i komponowanie Tylko tworzenie
Średni czas kompilacji 299,47 ms 399,09 ms 342,16 ms

Gdy po raz pierwszy dodaliśmy Compose do Sunflower, średni czas kompilacji wzrósł z 299 ms do 399 ms, czyli o 100 ms. Ten czas jest spowodowany tym, że kompilator Compose wykonuje dodatkowe zadania, aby przekształcić kod Compose zdefiniowany w projekcie.

Z kolei średni czas kompilacji spadł do 342 ms, czyli o 57 ms, po zakończeniu migracji aplikacji Sunflower do Compose. Ten spadek można przypisać kilku czynnikom, które łącznie skracają czas kompilacji, takim jak usunięcie powiązań danych, migracja zależności, które używają kapt do KSP, oraz aktualizacja kilku zależności do najnowszych wersji.

Podsumowanie

Wprowadzenie Compose spowoduje zwiększenie rozmiaru pliku APK aplikacji, a także wydajności czasu kompilacji aplikacji ze względu na proces kompilacji kodu Compose. Te kompromisy należy jednak rozważyć w kontekście zalet Compose, zwłaszcza w zakresie zwiększenia produktywności programistów po wdrożeniu Compose. Na przykład zespół Sklepu Play odkrył, że pisanie interfejsu wymaga znacznie mniej kodu, czasami nawet o 50%, co zwiększa produktywność i ułatwia utrzymanie kodu.

Więcej studiów przypadków znajdziesz w artykule Wdrażanie Compose for Teams.

Wyniki w czasie rzeczywistym

W tej sekcji znajdziesz informacje o wydajności w czasie działania w Jetpack Compose, które pomogą Ci zrozumieć, jak Jetpack Compose wypada pod tym względem w porównaniu z systemem View, oraz jak możesz to zmierzyć.

Inteligentne przekomponowanie

Gdy fragmenty interfejsu są nieprawidłowe, Compose próbuje ponownie skomponować tylko te fragmenty, które wymagają aktualizacji. Więcej informacji znajdziesz w dokumentacji Cykl życia funkcji kompozycyjnych i Fazy Jetpack Compose.

Profile podstawowe

Profile podstawowe to doskonały sposób na przyspieszenie typowych ścieżek użytkowników. Dołączenie do aplikacji profilu podstawowego może zwiększyć szybkość wykonywania kodu o około 30% od pierwszego uruchomienia, ponieważ pozwala uniknąć interpretacji i kompilacji JIT (just-in-time) w przypadku uwzględnionych ścieżek kodu.

Biblioteka Jetpack Compose zawiera własny profil podstawowy, więc gdy używasz jej w aplikacji, automatycznie uzyskujesz te optymalizacje. Jednak mają one wpływ tylko na ścieżki kodu w bibliotece Compose, dlatego zalecamy dodanie do aplikacji profilu podstawowego, aby obejmował ścieżki kodu poza Compose.

Porównanie z systemem View

Jetpack Compose ma wiele zalet w porównaniu z systemem widoków. Te ulepszenia opisujemy w kolejnych sekcjach.

Wszystko rozszerza widok

Każdy element View rysowany na ekranie, np. TextView, Button lub ImageView, wymaga przydzielenia pamięci, jawnego śledzenia stanu i różnych wywołań zwrotnych, aby obsługiwać wszystkie przypadki użycia. Dodatkowo niestandardowy View musi zaimplementować wyraźną logikę, aby zapobiec ponownemu rysowaniu, gdy nie jest to konieczne, np. w przypadku powtarzalnego przetwarzania danych.

Jetpack Compose rozwiązuje ten problem na kilka sposobów. Compose nie ma jawnych obiektów, które można aktualizować, do rysowania widoków. Elementy interfejsu to proste funkcje kompozycyjne, których informacje są zapisywane w kompozycji w sposób umożliwiający ich odtworzenie. Pozwala to ograniczyć śledzenie stanu, alokację pamięci i wywołania zwrotne tylko do funkcji kompozycyjnych, które wymagają tych funkcji, zamiast wymagać ich od wszystkich rozszerzeń danego Viewtypu.

Dodatkowo Compose zapewnia inteligentne ponowne komponowanie, które odtwarza wcześniej narysowany wynik, jeśli nie musisz wprowadzać zmian.

Wiele przebiegów układu

Tradycyjne grupy widoków mają wiele funkcji w interfejsach API pomiarów i układów, które sprawiają, że są podatne na wielokrotne przekazywanie układów. Wielokrotne przebiegi układu mogą powodować wykładniczy wzrost nakładu pracy, jeśli są wykonywane w określonych zagnieżdżonych punktach w hierarchii widoku.

Jetpack Compose wymusza pojedyncze przejście układu w przypadku wszystkich funkcji kompozycyjnych układu za pomocą umowy interfejsu API. Dzięki temu Compose może wydajnie obsługiwać rozbudowane drzewa interfejsu. Jeśli potrzebujesz kilku pomiarów, w funkcji Tworzenie wiadomości dostępne są pomiarowe funkcje wewnętrzne.

Wyświetlanie skuteczności uruchamiania

System widoku musi rozszerzyć układy XML, gdy po raz pierwszy wyświetla określony układ. Ten koszt jest zapisywany w Jetpack Compose, ponieważ układy są pisane w Kotlinie i kompilowane jak reszta aplikacji.

Testowanie porównawcze Compose

W Jetpack Compose 1.0 występują zauważalne różnice w wydajności aplikacji w trybach debug i release. W przypadku reprezentatywnych pomiarów czasu podczas profilowania aplikacji zawsze używaj wersji release zamiast debug.

Aby sprawdzić wydajność kodu Jetpack Compose, możesz użyć biblioteki Jetpack Macrobenchmark. Aby dowiedzieć się, jak używać jej z Jetpack Compose, zapoznaj się z projektem MacrobenchmarkSample.

Zespół Jetpack Compose używa też Macrobenchmark do wykrywania wszelkich regresji, które mogą wystąpić. Na przykład zapoznaj się z benchmarkiem dla leniwej kolumny i jego panelem, aby śledzić regresje.

Tworzenie instalacji profilu

Jetpack Compose to biblioteka niezależna od platformy, więc nie korzysta z Zygote, który wstępnie wczytuje klasy i elementy rysowalne pakietu UI Toolkit systemu widoków. Jetpack Compose 1.0 wykorzystuje instalację profilu w przypadku kompilacji wersji. Instalatory profili umożliwiają aplikacjom określanie krytycznego kodu, który ma być kompilowany z wyprzedzeniem (AOT) w momencie instalacji. Twórz reguły instalacji profilu dostarczanego z aplikacją, które skracają czas uruchamiania i zmniejszają zacinanie się aplikacji napisanych w Compose.