Benchmark

Mide con precisión el rendimiento de tu código dentro de Android Studio.
Actualización más reciente Versión estable actual Próxima versión potencial Versión beta Versión alfa
29 de septiembre de 2021 1.0.0 - - 1.1.0-alpha08

Cómo declarar dependencias

Para agregar una dependencia en Benchmark, debes agregar el repositorio de Maven de Google a tu proyecto. Consulta el repositorio de Maven de Google para obtener más información.

Agrega las dependencias de los artefactos que necesites en el archivo build.gradle de tu app o módulo:

Groovy

dependencies {
    androidTestImplementation "androidx.benchmark:benchmark-junit4:1.0.0"
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

Kotlin

dependencies {
    androidTestImplementation("androidx.benchmark:benchmark-junit4:1.0.0")
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

La biblioteca de comparativas también ofrece un complemento de Gradle que puedes usar con tu módulo de comparativas. Este complemento establece los valores predeterminados de la configuración de compilación para el módulo, establece la copia de resultados de comparativas en el host y proporciona la tarea de ./gradlew lockClocks.

Si deseas usar el complemento, incluye el siguiente classpath en tu archivo build.gradle de nivel superior:

Groovy

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath "androidx.benchmark:benchmark-gradle-plugin:1.0.0"
    }
}

Kotlin

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath("androidx.benchmark:benchmark-gradle-plugin:1.0.0")
    }
}

Luego, aplica el complemento al archivo build.gradle de tu módulo de comparativas.

Groovy

apply plugin: "androidx.benchmark"

Kotlin

plugins {
    id("androidx.benchmark")
}

Macrocomparativas

Para usar macrocomparativas en tu proyecto, agrega las siguientes dependencias a tu archivo build.gradle en tu app o módulo:

Groovy

dependencies {
  androidTestImplementation "androidx.benchmark:benchmark-macro-junit4:1.1.0-alpha08"
}

Kotlin

dependencies {
  androidTestImplementation("androidx.benchmark:benchmark-macro-junit4:1.1.0-alpha08")
}

Comentarios

Tus comentarios ayudan a mejorar Jetpack. Avísanos si descubres nuevos errores o tienes ideas para mejorar esta biblioteca. Consulta los errores existentes en esta biblioteca antes de crear uno nuevo. Para agregar tu voto a un error existente, haz clic en el botón de la estrella.

Cómo crear un error nuevo

Consulta la documentación sobre la Herramienta de seguimiento de errores para obtener más información.

Versión 1.1.0

Versión 1.1.0-alpha08

29 de septiembre de 2021

Lanzamiento de androidx.benchmark:benchmark-*:1.1.0-alpha08. La versión 1.1.0-alpha08 contiene estas confirmaciones.

Cambios en la API

  • Se habilitaron las macroscomparativas de desplazamiento para volver a la API 23. (If39c2, b/183129298)
  • Se agregó un nuevo tipo de métrica de muestra a la IU y el resultado de JSON que se centra en los percentiles de varias muestras por iteración. (I56247, b/199940612)
  • Se cambió a las métricas de punto flotante en las bibliotecas comparativas (truncadas en la IU de Studio). (I69249, b/197008210)

Versión 1.1.0-alpha07

1 de septiembre de 2021

Lanzamiento de androidx.benchmark:benchmark-*:1.1.0-alpha07. La versión 1.1.0-alpha07 contiene estas confirmaciones.

Cambios en la API

  • Se aumentó la API mínima a 21 para reflejar el nivel de API más bajo que se admitirá en el futuro. La API mínima actual admitida (29) sigue transmitiéndose mediante RequiredApi(). (I440d6, b/183129298)

Correcciones de errores

  • Se corrigió ProfileInstaller para facilitar que las apps que usan perfiles de referencia puedan ejecutar MacroBenchmarks mediante CompilationMode.BaselineProfile. (I42657, b/196074999) NOTA: También se debe actualizar a androidx.profileinstaller:profileinstaller:1.1.0-alpha04 o una versión posterior.
  • Las comparativas de StartupMode.COLD + CompilationMode.None ahora son más estables. (I770cd, b/196074999)

Versión 1.1.0-alpha06

18 de agosto de 2021

Lanzamiento de androidx.benchmark:benchmark-*:1.1.0-alpha06. La versión 1.1.0-alpha06 contiene estas confirmaciones.

Cambios en la API

  • Se agregó un argumento de instrumentación androidx.benchmark.iterations para permitir la anulación manual del recuento de iteraciones cuando se realizan pruebas o se generan perfiles a nivel local. (6188be, b/194137879)

Correcciones de errores

  • Se cambió a Simpleperf como generador de perfiles de muestras predeterminado en la API nivel 29 y versiones posteriores. (Ic4b34, b/158303822).

Errores conocidos

  • CompilationMode.BaselineProfile está en mantenimiento. Evita usarlo para determinar qué tan buen perfil es por ahora.

Versión 1.1.0-alpha05

4 de agosto de 2021

Lanzamiento de androidx.benchmark:benchmark-*:1.1.0-alpha05. La versión 1.1.0-alpha05 contiene estas confirmaciones.

Se canceló 1.1.0-alpha04 antes del lanzamiento debido a una falla esporádica. (b/193827052)

Cambios en la API

  • Se cambió startActivityAndWait para invocar el lanzamiento a través de am start, lo que reduce el tiempo de cada iteración de medición aproximadamente 5 segundos, a costa de ya no se admitan elementos parcelables de intent. (I5a6f5, b/192009149

Correcciones de errores

  • Reduce la agresividad de la detección de limitaciones térmicas y vuelve a calcular el modelo de referencia si se regulan con frecuencia. (I7327b)
  • Se corrigió FrameTimingMetric para que funcione en la versión beta de Android S. (Ib60cc, b/193260119)
  • Usa una EmptyActivity para sacar la app de destino de un estado de detención forzada a fin de admitir mejor CompilationMode.BaselineProfile. (Id7cac, b/192084204)
  • Se cambió la extensión del archivo de registro a .perfetto-trace para que coincida con el estándar de la plataforma. (I4c236, b/174663039)
  • StartupTimingMetric ahora genera la métrica "fullDrawnMs" para medir el tiempo que tarda tu app en completar la renderización. A fin de definir esta métrica para tu app, llama a Activity.reportFullyDrawn cuando el contenido inicial esté listo, por ejemplo, cuando los elementos de la lista inicial se carguen desde la base de datos o la red (método reportFullyDrawn disponible sin verificaciones de la versión de compilación en ComponentActivity). Ten en cuenta que tu prueba debe ejecutarse durante el tiempo suficiente para capturar la métrica (startActivityAndWait no espera a reportFullyDrawn). (If1141, b/179176560)
  • Se redujo el costo de agregar metadatos de IU a los seguimientos en más de 50 ms. (Ic8390, b/193923003)
  • Se aumentó drásticamente la frecuencia de sondeo cuando se detiene el seguimiento, lo que puede reducir el tiempo de ejecución de comparativas de inicio en más de un 30%. (Idfbc1, b/193723768)

Versión 1.1.0-alpha03

16 de junio de 2021

Lanzamiento de androidx.benchmark:benchmark-*:1.1.0-alpha03. La versión 1.1.0-alpha03 contiene estas confirmaciones.

Nuevas funciones

Correcciones de errores

  • Se actualizó el código de muestra de Gradle que suprime errores de comparativas para usar una API que no sea obsoleta con una sintaxis que también sea compatible con los usuarios de .gradle.kts.

    P. ej.:

    testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR,LOW-BATTERY"
    

Versión 1.1.0-alpha02

18 de mayo de 2021

La versión 1.1.0-alpha02 de Benchmark proporciona Macrocomparativas, un gran componente para generar comparativas. Además de generar comparativas, lo que le permite medir los bucles de CPU, macrocomparativas te permite medir interacciones completas de la aplicación, como inicio y desplazamiento, y capturar seguimientos. Para obtener más información, consulta la documentación sobre bibliotecas.

Lanzamiento de androidx.benchmark:benchmark-*:1.1.0-alpha02. La versión 1.1.0-alpha02 contiene estas confirmaciones.

Nuevas funciones

Se agregaron artefactos de macrocomparativas (androidx.benchmark:benchmark-macro-junit4 y androidx.benchmark:benchmark-macro):

  • Captura de métricas de rendimiento de inicio, desplazamiento y animación desde tu app, de forma local o en IC
  • Captura e inspección de seguimientos desde Android Studio

Correcciones de errores

  • Se ideó una solución alternativa al problema de permisos de shell en el directorio de salida de Android 12 (Nota: Es posible que se tenga que actualizar el complemento de Android para Gradle a la versión canary 7.0.0 y Android Studio a Arctic Fox (2020.3.1) para continuar capturando archivos de salida en dispositivos afectados). (Icb039)
  • Compatibilidad de caché de configuración en BenchmarkPlugin. (6be1c1, b/159804788)
  • Se corrigió la activación de forma predeterminada del archivo de salida simplificado en un directorio que no requiere requestLegacyExternalStorage=true. (8b5a4d, b/172376362)
  • Se corrigieron las advertencias de impresión de logcat cuando no encontraba subprocesos de JIT en versiones de la plataforma en las que no está presente. (I9cc63, b/161847393)
  • Se corrigió la frecuencia máxima del dispositivo de lectura. (I55c7a)

Versión 1.1.0-alpha01

10 de junio de 2020

Lanzamiento de androidx.benchmark:benchmark-common:1.1.0-alpha01, androidx.benchmark:benchmark-gradle-plugin:1.1.0-alpha01 y androidx.benchmark:benchmark-junit4:1.1.0-alpha01. La versión 1.1.0-alpha01 contiene estas confirmaciones.

Nuevas funciones de 1.1

  • Métrica de asignación: Las comparativas ahora ejecutan una fase adicional luego de la preparación y sincronización, y capturan los recuentos de asignación. Las asignaciones pueden causar problemas de rendimiento en versiones anteriores de la plataforma (los 140 ns en O se convirtieron en 8 ns en M, medidos en Nexus 5X con relojes bloqueados). Se muestra esta métrica en el resultado de la consola de Android Studio, así como en
  • Compatibilidad con la generación de perfiles: Ahora puedes capturar datos de generación de perfiles para obtener comparativas a fin de inspeccionar el motivo de la ejecución lenta de tu código. Benchmark admite la captura mediante seguimiento de métodos o muestreo de métodos desde ART. Estos archivos pueden inspeccionarse con el generador de perfiles de Android Studio mediante File > Open.
  • El complemento de Gradle de la biblioteca de Benchmark ahora brinda valores predeterminados para una configuración más simple:
    • Se establece testBuildType para lanzarse de forma predeterminada, a fin de evitar el uso de dependencias con cobertura de código incorporada. El buildType de lanzamiento es también el predeterminado, que permite que Android Studio seleccione automáticamente la variante de compilación correcta cuando abre un proyecto por primera vez. (b/138808399)
    • Se usa signingConfig.debug como la configuración de firma predeterminada (b/153583269).

** Correcciones de errores **

  • Se redujo de forma significativa la sobrecarga de la transición de preparación, en la que la primera medición para cada comparativa fue artificialmente más alta que otras. Este problema era más evidente en comparativas muy pequeñas (1 microsegundo o menos). (b/142058671)
  • Se corrigió el error InstrumentationResultParser que se mostraba para cada comparativa cuando se ejecutaba desde la línea de comandos. (I64988, b/154248456)

Errores conocidos

  • La línea de comandos y las invocaciones de Gradle de la biblioteca Benchmark no imprimen los resultados de forma directa. Para solucionar este problema, ejecuta el código mediante Studio o analiza el archivo de salida JSON a fin de obtener los resultados.
  • La función de informes de Benchmark no puede extraer informes de dispositivos que tengan una app instalada con un applicationID que termine en "android" o "download" (no distingue entre mayúsculas y minúsculas). Los usuarios que tengan este problema deberán actualizar el complemento de Gradle para Android a la versión 4.2-alpha01 o posterior.

Versión 1.0.0

Versión de Benchmark 1.0.0

20 de noviembre de 2019

Lanzamiento de androidx.benchmark:benchmark-common:1.0.0, androidx.benchmark:benchmark-gradle-plugin:1.0.0 y androidx.benchmark:benchmark-junit4:1.0.0 sin cambios desde la versión 1.0.0-rc01. La versión 1.0.0 contiene estas confirmaciones.

Funciones principales de la versión 1.0.0

La biblioteca de Benchmark te permite escribir comparativas de rendimiento del código de la app y obtener resultados rápidamente.

Evita problemas de compilación y configuración del tiempo de ejecución, y estabiliza el rendimiento del dispositivo para garantizar que las mediciones sean exactas y consistentes. Ejecuta las comparativas directamente en Android Studio o en integración continua para observar el rendimiento del código en el tiempo y evitar las regresiones.

Las funciones principales incluyen:

  • Estabilización del reloj
  • Priorización automática de subprocesos
  • Compatibilidad con las pruebas de rendimiento de IU, como en la muestra de RecyclerView
  • Repetición y calentamiento con JIT
  • Resultado de comparativa JSON para el posprocesamiento

Versión 1.0.0-rc01

23 de octubre de 2019

Lanzamiento de androidx.benchmark:benchmark-common:1.0.0-rc01, androidx.benchmark:benchmark-gradle-plugin:1.0.0-rc01 y androidx.benchmark:benchmark-junit4:1.0.0-rc01. La versión 1.0.0-rc01 contiene estas confirmaciones.

Nuevas funciones

  • Se agregó el seguimiento de systrace a las comparativas

Correcciones de errores

  • Se corrigió el problema de inestabilidad de métrica donde JIT no finalizaba antes del calentamiento debido a la falta de priorización (b/140773023).
  • Directorio de resultado de JSON unificado en el complemento de Gradle para Android 3.5 y 3.6

Versión 1.0.0-beta01

9 de octubre de 2019

Lanzamiento de androidx.benchmark:benchmark-common:1.0.0-beta01, androidx.benchmark:benchmark-gradle-plugin:1.0.0-beta01 y androidx.benchmark:benchmark-junit4:1.0.0-beta01. La versión 1.0.0-beta01 contiene estas confirmaciones.

Nuevas funciones

  • Ejecuta la recolección de elementos no utilizados antes de cada preparación para reducir la presión de memoria de una comparativa a otra (b/140895105).

Correcciones de errores

  • Se agregó la dependencia de androidx.annotation:android-experimental-lint para que el código de Java produzca correctamente los errores de lint cuando no se utiliza la API experimental, de forma similar a lo que proporciona la anotación experimental Kotlin para las llamadas a Kotlin.
  • Ahora detecta de manera correcta el uso del argumento de instrumentación additionalTestOutputDir para el resultado en el complemento de Gradle para Android 3.6, a fin de saber cuándo AGP procesará la copia de datos.
  • Se corrigió la frecuencia de reloj no detectada en JSON para imprimir correctamente -1 (b/141945670).

Versión 1.0.0-alpha06

18 de septiembre de 2019

Lanzamiento de androidx.benchmark:benchmark-common:1.0.0-alpha06, androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha06 y androidx.benchmark:benchmark-junit4:1.0.0-alpha06. La versión 1.0.0-alpha06 contiene estas confirmaciones.

Nuevas funciones

  • Se agregó una búsqueda del uso incorrecto del paquete anterior para el corredor de prueba, que ahora proporciona un mensaje de error más útil.

Cambios en la API

  • La anotación experimental ExperimentalAnnotationReport ahora es correctamente pública. El uso de la API experimental BenchmarkState#report ahora requiere esta anotación

Versión 1.0.0-alpha05

5 de septiembre de 2019

Lanzamiento de androidx.benchmark:benchmark-common:1.0.0-alpha05, androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha05 y androidx.benchmark:benchmark-junit4:1.0.0-alpha05. Para conocer las confirmaciones incluidas en esta versión, consulta este vínculo.

Cambios en la API

  • La API de BenchmarkState.reportData ahora se marca como experimental

Correcciones de errores

  • Se corrigió la secuencia de comandos de bloqueo de reloj, que fallaba en los dispositivos a los que les faltaban las utilidades de shell cut o expr.
  • Se corrigió un problema con la tarea ./gradlew lockClocks que se bloqueaba en los dispositivos con permisos de administrador con una versión anterior de la utilidad su, que no era compatible con la marca -c.

Versión 1.0.0-alpha04

7 de agosto de 2019

Lanzamiento de androidx.benchmark:benchmark-common:1.0.0-alpha04, androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha04 y androidx.benchmark:benchmark-junit4:1.0.0-alpha04. Para conocer las confirmaciones incluidas en esta versión, consulta este vínculo.

También se agregó nueva documentación sobre cómo usar la biblioteca Benchmark sin Gradle, tanto para usarla con diferentes sistemas de compilación (como Bazel o Buck), como para cuando se ejecuta en CI. Para obtener más información, consulta Cómo compilar comparativas sin Gradle y Cómo ejecutar comparativas en integración continua.

Nuevas funciones

  • Complemento de Gradle
    • Ahora inhabilita automáticamente la cobertura de la prueba y establece AndroidBenchmarkRunner de forma predeterminada (b/138374050).
    • Se agregó compatibilidad con la nueva copia de datos basada en AGP, para cuando se ejecutan comparativas y se usa AGP 3.6+.
  • Adiciones de formato JSON.
    • Tiempo total de ejecución de prueba de comparativas (b/133147694).
    • Las comparativas @Parameterized que usan una string de nombre (por ejemplo, @Parameters(name = "size={0},depth={1}")) ahora muestran nombres y valores de parámetros por comparativa en el resultado de JSON ( b/132578772 ).
  • Modo de ejecución en seco (b/138785848).
    • Se agregó un modo de "ejecución en seco" para ejecutar cada bucle de comparativa solo una vez, a fin de verificar errores/fallas sin capturar mediciones. Esto puede ser útil, p. ej., para ejecutar comparativas con rapidez en el envío previo para verificar que no estén dañadas.

Cambios en la API

  • Se modificó la estructura del módulo y se dividió la biblioteca (b/138451391).
    • benchmark:benchmark-junit4 contiene clases con dependencia de JUnit: AndroidBenchmarkRunner y BenchmarkRule, que se movieron al paquete androidx.benchmark.junit4.
    • benchmark:benchmark-common contiene el resto de la lógica, incluida la API de BenchmarkState.
    • Esta división permitirá que la biblioteca admita comparativas sin las API de JUnit4 en el futuro.
  • Las advertencias de configuración ahora se tratan como errores y producen fallas en las pruebas (b/137653596).
    • Esto se hace para alentar aún más las mediciones precisas, especialmente en IC.
    • Estos errores se pueden volver a reducir a advertencias con un argumento de instrumentación. Por ejemplo: -e androidx.benchmark.suppressErrors "DEBUGGABLE,LOW_BATTERY"

Correcciones de errores

  • Los errores que se producen al escribir en el almacenamiento externo en dispositivos Q proporcionan mensajes más descriptivos, con sugerencias sobre cómo resolver el problema.
  • Las pantallas se encienden automáticamente durante las ejecuciones de comparativas, en lugar de fallar cuando la pantalla está apagada.

Contribuciones externas

  • ¡Gracias a Sergey Zakharov por contribuir con las mejoras de resultados de JSON y la solución para los problemas de apagado de la pantalla!

Versión 1.0.0-alpha03

2 julio de 2019

Lanzamiento de androidx.benchmark:benchmark:1.0.0-alpha03 y androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha03. Para conocer las confirmaciones incluidas en esta versión, consulta este vínculo.

Nuevas funciones

  • Se expone la duración de la suspensión debido a la regulación térmica por comparativas en el informe de JSON completo.

Correcciones de errores

  • Ya no es necesario aplicar el complemento de Gradle después de los complementos de Android y el bloque Android.
  • Se agregó compatibilidad con informes de comparativas en dispositivos Android 10 que usan almacenamiento específico.

Versión 1.0.0-alpha02

6 de junio de 2019

Lanzamiento de androidx.benchmark:1.0.0-alpha02 y androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha02. Para conocer las confirmaciones incluidas en esta versión, consulta este vínculo.

Ten en cuenta que tratamos al esquema JSON como una API. Nuestra idea es seguir las mismas restricciones de estabilidad que otras API: estable (con muy pocas excepciones) una vez en la versión Beta, y corregido en la versión final, con solo adiciones en versiones menores y cambios/eliminaciones en versiones principales.

Cambios en la API

  • Se revisó el esquema de JSON. Es probable que los próximos cambios en el esquema de JSON se limiten a adiciones:

    • Se reorganizó la estructura del objeto de resultado para admitir grupos de métricas adicionales en el futuro (b/132713021).
    • Se agregó información de contexto de ejecución de prueba, como información sobre el dispositivo y la compilación, y si los relojes están bloqueados, al objeto de nivel superior (b/132711920).
    • Los nombres de métrica de tiempo ahora incluyen "ns" (b/132714527).
    • Se agregaron estadísticas adicionales por métrica informada (máxima, media, mínima) y se quitó la estadística de resumen de "nanos" (b/132713851).
  • Se quitó el resultado de XML (b/132714414).

  • Se quitó la detección de regulador térmico de la API de BenchmarkState.reportData (b/132887006 ).

Correcciones de errores

  • Se corrigió un error por el que ./gradlew lockClocks no permanecía en algunos dispositivos recientes del SO (b/133424037).
  • Se inhabilitó la detección de regulación para el emulador (b/132880807).

Versión 1.0.0-alpha01

7 de mayo de 2019

Lanzamiento de androidx.benchmark:benchmark:1.0.0-alpha01. Las confirmaciones incluidas en esta versión están disponibles en este vínculo.