Compara las métricas de Compose y View

Jetpack Compose acelera el desarrollo de IU y mejora el desarrollo de Android. Sin embargo, ten en cuenta cómo agregar Compose a una app existente puede afectar métricas como el tamaño del APK de una app, la compilación y el rendimiento del tiempo de ejecución.

Tamaño del APK y tiempos de compilación

En esta sección, se explica el impacto en el tamaño del APK y el tiempo de compilación en la app de ejemplo de Sunflower, una app que muestra las prácticas recomendadas para migrar una app basada en objetos View a Compose.

Tamaño del APK

Si agregas bibliotecas al proyecto, aumentará el tamaño de su APK. Los siguientes resultados corresponden al APK de lanzamiento reducido de cada proyecto con la reducción de recursos y código habilitada, con el modo completo de R8 y medido con el Analizador de APK.

Solo vistas Vistas combinadas y Compose Solo Compose
Tamaño de la descarga 2,252 KB 3,034 KB 2,966 KB

Cuando se agregó Compose por primera vez a Sunflower, el tamaño del APK aumentó de 2,252 KB a 3,034 KB, un aumento de 782 KB. El APK generado consistió en la compilación de la IU con una combinación de Views y Compose. Se espera este aumento a medida que se agregaron dependencias adicionales a Sunflower.

Por el contrario, cuando se migró Sunflower a una app solo para Compose, el tamaño del APK bajó de 3,034 KB a 2,966 KB, una disminución de 68 KB. Esta disminución se debió a quitar dependencias de View sin usar, como AppCompat y ConstraintLayout.

Tiempo de compilación

Agregar Compose aumenta el tiempo de compilación de tu app a medida que el compilador de Compose procesa elementos componibles en tu app. Los siguientes resultados se obtuvieron con la herramienta gradle-profiler independiente, que ejecuta una compilación varias veces para que se pueda obtener un tiempo promedio de compilación correspondiente a la duración de la compilación de depuración de Sunflower:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
Solo vistas Vistas combinadas y Compose Solo Compose
Tiempo promedio de compilación 299.47 ms 399.09 ms 342.16 ms

Cuando se agregó Compose por primera vez a Sunflower, el tiempo promedio de compilación aumentó de 299 ms a 399 ms, un aumento de 100 ms. Esta duración se debe a que el compilador de Compose realiza tareas adicionales para transformar el código de Compose definido en el proyecto.

Por el contrario, el tiempo de compilación promedio disminuyó a 342 ms, una disminución de 57 ms, cuando se completó la migración de Sunflower a Compose. Esta reducción se puede atribuir a varios factores que reducen el tiempo de compilación de forma colectiva, como quitar la vinculación de datos, migrar dependencias que usan kapt a KSP y actualizar varias dependencias a sus versiones más recientes.

Resumen

La adopción de Compose aumentará de forma efectiva el tamaño del APK de tu app y, además, aumentará el rendimiento del tiempo de compilación de tu app debido al proceso de compilación del código de Compose. Sin embargo, estas compensaciones se deben comparar con los beneficios de Compose, en especial los relacionados con los aumentos de productividad de los desarrolladores cuando se adopta Compose. Por ejemplo, el equipo de Play Store descubrió que escribir la IU requiere mucho menos código (en ocasiones, hasta un 50%), lo que aumenta la productividad y la capacidad de mantenimiento del código.

Puedes leer más casos de éxito en Cómo adoptar Compose para equipos.

Rendimiento del tiempo de ejecución

En esta sección, se abordan temas relacionados con el rendimiento del tiempo de ejecución en Jetpack Compose para ayudarte a comprender cómo se compara Jetpack Compose con el rendimiento del sistema de View y cómo puedes medirlo.

Recomposiciones inteligentes

Cuando algunas partes de la IU no son válidas, Compose intenta recomponer solo las partes que deben actualizarse. Obtén más información en la documentación sobre el ciclo de vida de los elementos componibles y las fases de Jetpack Compose.

Perfiles de Baseline

Los perfiles de Baseline son una manera excelente de acelerar los recorridos comunes de los usuarios. Incluir un perfil de Baseline en tu app puede mejorar la velocidad de ejecución del código en aproximadamente un 30% desde el primer lanzamiento, ya que evita la interpretación y los pasos de compilación justo a tiempo (JIT) para las instrucciones de código incluidas.

La biblioteca de Jetpack Compose incluye su propio perfil de Baseline, y estas optimizaciones se obtienen automáticamente cuando usas Compose en tu app. Sin embargo, estas optimizaciones solo afectan las instrucciones de código dentro de la biblioteca de Compose, por lo que te recomendamos que agregues un perfil de Baseline a tu app para abarcar las instrucciones de código fuera de Compose.

Comparación con el sistema de View

Jetpack Compose tiene muchas mejoras con respecto al sistema de View. Estas mejoras se describen en las siguientes secciones.

Todo supera a View

Cada View que se muestra en la pantalla, como TextView, Button o ImageView, requiere asignaciones de memoria, seguimiento de estado explícito y varias devoluciones de llamada para admitir todos los casos de uso. Además, el propietario de la View personalizada debe implementar una lógica explícita para evitar volver a dibujar cuando no sea necesario, por ejemplo, para el procesamiento repetitivo de datos.

Jetpack Compose lo soluciona de varias maneras. Compose no tiene objetos actualizables explícitos para dibujar vistas. Los elementos de la IU son funciones simples de componibilidad cuya información se escribe en la composición de manera que se pueda volver a reproducir. Esto ayuda a reducir el seguimiento de estado explícito, las asignaciones de memoria y las devoluciones de llamada solo a los elementos componibles que requieren esas funciones, en lugar de solicitarlas para todas las extensiones de un tipo de View determinado.

Además, Compose proporciona recomposiciones inteligentes, que reproducen el resultado dibujado anteriormente si no necesitas realizar cambios.

Múltiples pases de diseño

Los ViewGroups tradicionales tienen mucha expresividad en sus APIs de medición y diseño, lo que los hace propensos a varios pases de diseño. Realizar varios pases de diseño puede agregar más trabajo si se realizan en ciertos puntos anidados de la jerarquía de vistas.

Jetpack Compose aplica un solo pase de diseño para todos los elementos de diseño componibles a través de su contrato de API. Esto permite que Compose procese de manera eficiente los árboles detallados de la IU. En caso de que se necesiten varias mediciones, Compose tiene mediciones intrínsecas.

El rendimiento del inicio de View

El sistema de View debe aumentar los diseños XML cuando muestra un diseño en particular por primera vez. Este costo se ahorra en Jetpack Compose, ya que los diseños se escriben en Kotlin y se compilan como el resto de tu app.

Comparativas de Compose

En Jetpack Compose 1.0, existen diferencias notables entre el rendimiento de una app en los modos debug y release. Para los tiempos representativos, siempre usa la compilación de release en lugar de debug cuando generes perfiles de tu app.

Para comprobar el rendimiento de tu código de Jetpack Compose, puedes usar la biblioteca de Jetpack Macrobenchmark. Si deseas aprender a usarlo con Jetpack Compose, consulta el proyecto de MacrobenchmarkSample.

El equipo de Jetpack Compose también usa Macrobenchmark para detectar regresiones que se puedan producir. Por ejemplo, consulta las comparativas de la columna diferida y su panel para realizar un seguimiento de las regresiones.

Instalación de perfiles de Compose

Dado que Jetpack Compose es una biblioteca sin empaquetar, no se beneficia de Zygote que precarga las clases y los elementos de diseño del kit de herramientas de la IU del sistema View. Jetpack Compose 1.0 usa la instalación de perfiles para las compilaciones de lanzamiento. Los instaladores de perfiles permiten que las apps especifiquen código crítico que se compilará por adelantado (AOT) en el momento de la instalación. Compose envía las reglas de instalación del perfil que reducen los tiempos de inicio y los bloqueos en las apps de Compose.