La biblioteca de Jetpack Microbenchmark te permite obtener comparativas de tu código nativo de Android (Kotlin o Java) desde 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, te recomendamos que generes el perfil de tu código. De esta forma, podrás encontrar operaciones costosas que sería conveniente optimizar. También puede mostrar el motivo de la lentitud, ya que muestra lo que sucede mientras se ejecutan las operaciones, como la ejecución en un subproceso de baja prioridad, la suspensión debido al acceso al disco o la llamada 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 Microbenchmark. 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.
Si deseas obtener información para usar la biblioteca en un entorno de integración continua (CI), consulta la sección Cómo ejecutar comparativas en 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.
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 (para 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 puede aplicar con una tarea de Gradle (gradlew lockClocks
) o de forma manual en CI. Aunque esta es la mejor manera de garantizar un rendimiento estable, la mayoría de los dispositivos no la admiten, ya que se requiere un dispositivo con permisos de administrador en Android.
Modo de rendimiento sostenido
Window.setSustainedPerformanceMode()
es una función compatible con 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 Microbenchmark usa una combinación de esta API y el lanzamiento de su propia actividad para evitar la limitación térmica y estabilizar los resultados.
Esta función está habilitada de forma predeterminada por el testInstrumentationRunner
configurado por el complemento de Android para 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 usas el bloqueo de reloj ni el rendimiento sostenido, la biblioteca realiza la detección automática de limitación térmica. Cuando están habilitadas, las comparativas internas se ejecutan periódicamente para determinar cuándo la temperatura del dispositivo subió tanto como para disminuir el rendimiento de la CPU. Cuando detecta un menor rendimiento de la CPU, la biblioteca pausa la ejecución para permitir que el dispositivo se enfríe y, luego, vuelve a intentar ejecutar las comparativas actuales.
Compilación AOT
Las microcomparativas complejas pueden tardar mucho tiempo en estabilizarse y hacer
y la estabilización es muy difícil de detectar. Como una medición coherente y una rapidez
de iteración son las principales prioridades, el complemento androidx.benchmark
compila tu APK de microcomparativas de forma predeterminada, similar a lo siguiente:
CompilationMode.Full
en Macrobenchmarks Este comportamiento requiere comparativas
1.3.0-beta01+
y el complemento de Android para Gradle 8.4.0+
. Puedes inhabilitar esta opción
de tu app estableciendo androidx.benchmark.forceaotcompilation=false
en tu
archivo gradle.properties
.
Ejemplos
Consulta los siguientes ejemplos en el repositorio de GitHub:
Recursos adicionales
Envía comentarios
Si deseas informar errores o enviar solicitudes de funciones cuando usas las comparativas, consulta la herramienta de seguimiento de errores pública.
Recomendaciones para ti
- Nota: El texto del vínculo se muestra cuando JavaScript está desactivado
- Cómo realizar comparativas de tu app
- Cómo crear perfiles de Baseline {:#creating-profile-rules}
- Biblioteca de JankStats