The public documentation for macrobenchmark explains how to use the library. This page focuses on specifics to writing library macrobenchmarks in the AndroidX repo. If you're looking for measuring CPU perf of individual functions, see the guide for MICRObenchmarks here.
Benchmarks are just regular instrumentation tests! Just use the MacrobenchmarkRule
provided by the library:
@get:Rule val benchmarkRule = MacrobenchmarkRule() @Test fun startup() = benchmarkRule.measureRepeated( packageName = "mypackage.myapp", metrics = listOf(StartupTimingMetric()), startupMode = StartupMode.COLD, iterations = 10 ) { // this = MacrobenchmarkScope pressHome() val intent = Intent() intent.setPackage("mypackage.myapp") intent.setAction("mypackage.myapp.myaction") startActivityAndWait(intent) }
@Rule public MacrobenchmarkRule mBenchmarkRule = MacrobenchmarkRule() @Test public void startup() { mBenchmarkRule.measureRepeated( "mypackage.myapp", Collections.singletonList(new StartupTimingMetric()), StartupMode.COLD, /* iterations = */ 10, scope -> { scope.pressHome(); Intent intent = Intent(); intent.setPackage("mypackage.myapp"); intent.setAction("mypackage.myapp.myaction"); scope.startActivityAndWait(intent); return Unit.INSTANCE; } ); }
As in the public documentation, macrobenchmarks in the AndroidX repo are comprised of an app, and a separate macrobenchmark test module. In the AndroidX repository, there are additional requirements:
Macrobenchmark test module path in settings.gradle
must end with macrobenchmark
to run in CI.
Macrobenchmark target module path in settings.gradle
must end with macrobenchmark-target
to follow convention.
Each library group should declare its own in-group macrobenchmark test and app module. More than one is allowed, which is sometimes necessary to compare different startup behaviors, see e.g. :emoji2:integration-tests:init-<disabled/enabled>-macrobenchmark-target
. Note that comparing multiple app variants are not currently supported by CI.
Compose Macrobenchmark Examples:
Note: Compose macrobenchmarks are ideally duplicated with View system counterparts, defined in :benchmark:integration-tests:macrobenchmark-target
. This is how we compare performance of the two systems.