Cómo realizar comparativas de tu app

Las comparativas sirven para probar el rendimiento de tu aplicación. Puedes ejecutar comparativas de forma regular a fin de analizar y depurar problemas de rendimiento, así como para asegurarte de que no se introduzcan regresiones en los cambios recientes.

Android ofrece dos bibliotecas y enfoques de comparativas que son útiles para analizar y probar diferentes tipos de situaciones en tu aplicación: Benchmark y Macrobenchmark.

Diferencias entre Benchmark y Macrobenchmark

La biblioteca de Jetpack Benchmark te permite obtener comparativas del código de la app directamente en un bucle. Está diseñada para medir el trabajo de la CPU que evaluará el rendimiento en el mejor de los casos (JIT en caliente, acceso del disco al almacenamiento en caché), como el que verías en un bucle interno o una función específica en ejecución.

Las comparativas se escriben para llamar directamente al código del que se obtiene la comparativa; por ejemplo:

@get:Rule
val benchmarkRule = BenchmarkRule()

@Test
fun myBenchmarkTest() {
    benchmarkRule.measureRepeated {
        // code or function call that you want to benchmark
    }
}

La biblioteca de Benchmark solo informa datos sobre tu aplicación, no sobre el sistema en general. Por lo tanto, se recomienda para analizar el rendimiento de situaciones específicas de la app, no para las que pueden estar relacionadas con problemas generales del sistema. Por ejemplo, el inicio de una aplicación abarca operaciones que tienen lugar fuera de la app y antes de que se ejecute el código de esta, por lo que resulta útil consultar esa información cuando se investigan problemas con el rendimiento del inicio. Las pruebas de microcomparativas no sirven para tratar de corregir este caso de uso.

Macrobenchmark mide interacciones del usuario final más grandes, como el inicio, el desplazamiento y las animaciones. A diferencia de la biblioteca de Benchmark, la de Macrobenchmark inserta eventos y supervisa los resultados de forma externa; desde una aplicación de pruebas que proporcionas tú.

Macrobenchmark ofrece control directo sobre el entorno de rendimiento que se está probando. Por ejemplo, puedes especificar el rendimiento de inicio en frío para la primera vez que se instala la app, además de opciones de inicio en caliente "lento" y "rápido", como se muestra en el siguiente ejemplo adaptado de la muestra de Macrobenchmark:

@Test
fun startup() = benchmarkRule.measureStartup(
    packageName = "mypackage.myapp",
    metrics = listOf(StartupTimingMetric()),
    iterations = 5,
    startupMode = StartupMode.COLD
) {
    pressHome()
    startActivityAndWait(Intent().apply {
        action = "mypackage.myapp.myaction"
    })
}

Como parte de los resultados, Macrobenchmark genera archivos de registro que puedes visualizar en Android Studio para detectar problemas de rendimiento que quieres analizar y depurar.

Benchmark Macrobenchmark
Medición de funciones individuales Medición de puntos de entrada de nivel superior (por ejemplo, inicio de una actividad o desplazamiento en una lista)
Prueba del trabajo de la CPU durante el proceso Prueba de la app completa fuera del proceso
Velocidad de iteración rápida (con frecuencia, menos de 10 segundos) Velocidad de iteración media (con frecuencia, mayor a un minuto)
Muestreo y seguimiento de métodos opcionales Los resultados incluyen registros de la generación de perfiles
Nivel de API 14 como mínimo Nivel de API 23 como mínimo