Microcomparativas

La Biblioteca de microcomparativas de Jetpack te permite obtener rápidamente comparativas de tu código nativo de Android (Kotlin o Java) dentro de Android Studio. La biblioteca se ocupa de la preparación, mide el rendimiento del código y los recuentos de asignaciones, y genera resultados de comparativas en la consola de Android Studio y en un archivo JSON con más detalles.

Antes de escribir comparativas, se recomienda generar el perfil de tu código. De esta forma, podrás encontrar operaciones costosas que sería conveniente optimizar. También puede revelar el motivo de la lentitud, ya que muestra lo que sucede cuando se ejecutan las operaciones. Estos podrían ejecutarse en un subproceso de baja prioridad, suspenderse por requerir acceso al disco o llamar de manera inesperada a una función costosa, como la decodificación de un mapa de bits.

Las microcomparativas son más útiles para el trabajo de la CPU que se ejecuta muchas veces en la app, también conocido como ruta de acceso de código activa. Algunos buenos ejemplos son el desplazamiento de RecyclerView con un elemento a la vez, las conversiones o el procesamiento de datos y otros fragmentos de código que se usan de manera repetida.

Otros tipos de código son más difíciles de medir con la Biblioteca de microcomparativas. Debido a que las comparativas se ejecutan en un bucle, el código que no se ejecute con frecuencia o que tenga un rendimiento diferente cuando se lo llame varias veces podría no ser apropiado para generar comparativas.

Para obtener información sobre cómo usar la biblioteca en un entorno de integración continua (CI), consulta la sección Cómo ejecutar comparativas en la integración continua.

Evita medir la caché

Evita medir solo la caché. Por ejemplo, las comparativas de diseño de una vista personalizada podrían medir solo el rendimiento de la caché de diseño. Para evitar que esto suceda, puedes pasar diferentes parámetros de diseño en cada bucle. En otros casos, como cuando se mide el rendimiento del sistema de archivos, podría resultar difícil, ya que el SO almacena en caché el sistema de archivos mientras está en un bucle.

Código ejecutado con poca frecuencia

Es poco probable que Android Runtime (ART) compile mediante JIT el código que se ejecuta una vez durante el inicio de la app. Por lo tanto, generar comparativas de este código con microcomparativas, en las que se ejecuta en un bucle cerrado, no es una manera realista de medir el rendimiento.

Para comparar este tipo de código, recomendamos Jetpack Macrobenchmark, que admite la medición de interacciones generales de usuario, como rendimiento durante el inicio de la app y el desplazamiento.

Obtén comparativas coherentes

En los dispositivos móviles, los relojes cambian de manera dinámica del estado alto (para el rendimiento) al estado bajo (a fin de ahorrar energía cuando el dispositivo se calienta). Estos relojes variables pueden hacer que los números de tus comparativas varíen en gran medida, por lo que la biblioteca proporciona maneras de abordar este problema.

Bloquea los relojes (requiere un dispositivo con permisos de administrador)

La mejor manera de estabilizar el rendimiento consiste en bloquear los relojes. De esta manera, se garantiza que los relojes nunca estén lo suficientemente altos para calentar el dispositivo, o bajos si las comparativas no están usando la CPU por completo. Se aplica automáticamente cuando se ejecutan microcomparativas con Gradle, o bien se puede aplicar de forma manual en IC. Si bien esta es la mejor manera de garantizar un rendimiento estable, la mayoría de los dispositivos no la admiten, ya que se necesitan dispositivos Android con permisos de administrador.

Modo de rendimiento sostenido

Window.setPersistentPerformanceMode() es una función compatible con los dispositivos que permiten que una app opte por una frecuencia de CPU máxima más baja. Cuando se ejecuta en dispositivos compatibles, la Biblioteca de microcomparativas usa una combinación de esta API y el lanzamiento de su propia actividad para evitar los modelos térmicos y estabilizar los resultados.

Esta funcionalidad está habilitada de forma predeterminada por el conjunto testInstrumentationRunner del complemento de Gradle. Si deseas usar un ejecutor personalizado, puedes crear una subclase de AndroidBenchmarkRunner y usarla como testInstrumentationRunner.

El ejecutor lanza una actividad opaca en pantalla completa para garantizar que las comparativas se ejecuten en primer plano y no se superponga ninguna otra app.

Pausado de la ejecución automática

Si no se usan ni el bloqueo de relojes ni el rendimiento sostenido, la biblioteca realiza una detección automática de modelos térmicos. Cuando están habilitadas, las comparativas internas se ejecutan periódicamente a fin de determinar cuándo la temperatura del dispositivo subió tanto como para disminuir el rendimiento de la CPU. Cuando se detecta un rendimiento reducido de la CPU, la biblioteca pausa la ejecución para permitir que el dispositivo se enfríe y vuelve a intentar ejecutar las comparativas actuales.

Ejemplos

Recursos adicionales

Cómo enviar comentarios

Si deseas informar errores o enviar solicitudes de funciones cuando usas las comparativas, consulta la herramienta de seguimiento de problemas de acceso público.