Informationen zur Verwendung der Microbenchmark-Bibliothek durch Hinzufügen von Änderungen an Ihrem Anwendungscode finden Sie im Abschnitt Schnellstart. Informationen zum vollständigen Einrichten mit komplizierteren Änderungen an Ihrem Code finden Sie im Abschnitt Vollständige Projekteinrichtung.
Kurzanleitung
In diesem Abschnitt wird gezeigt, wie Sie Benchmarking ausprobieren und einmalige Messungen durchführen können, ohne Code in Module verschieben zu müssen. Für genaue Leistungsergebnisse müssen Sie das Debugging in Ihrer App deaktivieren. Führen Sie diese Schritte daher in einer lokalen Arbeitskopie aus, ohne die Änderungen in Ihrem Quellcodeverwaltungssystem zu committen.
So führen Sie ein einmaliges Benchmarking durch:
Fügen Sie die Bibliothek der Datei
build.gradle
oderbuild.gradle.kts
Ihres Moduls hinzu:Kotlin
dependencies { implementation("androidx.benchmark:benchmark-junit4:1.2.4") }
Groovy
dependencies { implementation 'androidx.benchmark:benchmark-junit4:1.2.4' }
Verwenden Sie eine
implementation
-Abhängigkeit anstelle einerandroidTestImplementation
-Abhängigkeit. Wenn SieandroidTestImplementation
verwenden, können die Benchmarks nicht ausgeführt werden, da das Manifest der Bibliothek nicht in das App-Manifest eingefügt wird.Aktualisieren Sie den Build-Typ
debug
so, dass er nicht debugfähig ist:Kotlin
android { ... buildTypes { debug { isDebuggable = false } } }
Groovy
android { ... buildTypes { debug { debuggable false } } }
Ändern Sie
testInstrumentationRunner
inAndroidBenchmarkRunner
:Kotlin
android { ... defaultConfig { testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Groovy
android { ... defaultConfig { testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Fügen Sie eine Instanz von
BenchmarkRule
in einer Testdatei im VerzeichnisandroidTest
hinzu, um Ihren Benchmark hinzuzufügen. Weitere Informationen zum Schreiben von Benchmarks finden Sie unter Microbenchmark-Klasse erstellen.Das folgende Code-Snippet zeigt, wie Sie einem instrumentierten Test einen Benchmark hinzufügen:
Kotlin
@RunWith(AndroidJUnit4::class) class SampleBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @Test fun benchmarkSomeWork() { benchmarkRule.measureRepeated { doSomeWork() } } }
Java
@RunWith(AndroidJUnit4.class) class SampleBenchmark { @Rule public BenchmarkRule benchmarkRule = new BenchmarkRule(); @Test public void benchmarkSomeWork() { BenchmarkRuleKt.measureRepeated( (Function1<BenchmarkRule.Scope, Unit>) scope -> doSomeWork() ); } } }
Wenn Sie wissen möchten, wie Sie einen Benchmark schreiben, springen Sie zu Microbenchmark-Klasse erstellen.
Vollständige Projekteinrichtung
Wenn Sie regelmäßige Benchmarking-Tests statt einmaliger Tests einrichten möchten, isolieren Sie Benchmarks in einem eigenen Modul. So wird sichergestellt, dass die Konfiguration, z. B. das Festlegen von debuggable
auf false
, von regulären Tests getrennt ist.
Da Microbenchmark Ihren Code direkt ausführt, sollten Sie den Code, den Sie testen möchten, in ein separates Gradle-Modul einfügen und eine Abhängigkeit von diesem Modul festlegen, wie in Abbildung 1 dargestellt.

:app
, :microbenchmark
und :benchmarkable
, mit denen Microbenchmarks Code im Modul :benchmarkable
testen können.Wenn Sie ein neues Gradle-Modul hinzufügen möchten, können Sie den Modulassistenten in Android Studio verwenden. Der Assistent erstellt ein Modul, das für Benchmarking vorkonfiguriert ist. Es wird ein Benchmark-Verzeichnis hinzugefügt und debuggable
wird auf false
festgelegt.
Klicken Sie in Android Studio im Bereich Project mit der rechten Maustaste auf Ihr Projekt oder Modul und dann auf New > Module.
Wählen Sie im Bereich Vorlagen die Option Benchmark aus.
Wählen Sie Microbenchmark als Benchmark-Modultyp aus.
Geben Sie „microbenchmark“ als Modulnamen ein.
Klicken Sie auf Fertig.

Nachdem das Modul erstellt wurde, ändern Sie die Datei build.gradle
oder build.gradle.kts
und fügen Sie androidTestImplementation
dem Modul mit dem zu benchmarkenden Code hinzu:
Kotlin
dependencies { // The module name might be different. androidTestImplementation(project(":benchmarkable")) }
Groovy
dependencies { // The module name might be different. androidTestImplementation project(':benchmarkable') }
Microbenchmark-Klasse erstellen
Benchmarks sind standardmäßige Instrumentierungstests. Verwenden Sie zum Erstellen eines Benchmarks die von der Bibliothek bereitgestellte Klasse BenchmarkRule
. Verwenden Sie zum Benchmarking von Aktivitäten ActivityScenario
oder ActivityScenarioRule
. Verwenden Sie @UiThreadTest
, um UI-Code zu testen.
Der folgende Code zeigt ein Beispiel für einen Benchmark:
Kotlin
@RunWith(AndroidJUnit4::class) class SampleBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @Test fun benchmarkSomeWork() { benchmarkRule.measureRepeated { doSomeWork() } } }
Java
@RunWith(AndroidJUnit4.class) class SampleBenchmark { @Rule public BenchmarkRule benchmarkRule = new BenchmarkRule(); @Test public void benchmarkSomeWork() { final BenchmarkState state = benchmarkRule.getState(); while (state.keepRunning()) { doSomeWork(); } } }
Zeitsteuerung für die Einrichtung deaktivieren
Sie können das Timing für Codeabschnitte deaktivieren, die Sie nicht mit dem Block runWithTimingDisabled{}
messen möchten. Diese Abschnitte enthalten in der Regel Code, der bei jeder Iteration des Benchmarks ausgeführt werden muss.
Kotlin
// using random with the same seed, so that it generates the same data every run private val random = Random(0) // create the array once and just copy it in benchmarks private val unsorted = IntArray(10_000) { random.nextInt() } @Test fun benchmark_quickSort() { // ... benchmarkRule.measureRepeated { // copy the array with timing disabled to measure only the algorithm itself listToSort = runWithTimingDisabled { unsorted.copyOf() } // sort the array in place and measure how long it takes SortingAlgorithms.quickSort(listToSort) } // assert only once not to add overhead to the benchmarks assertTrue(listToSort.isSorted) }
Java
private final int[] unsorted = new int[10000]; public SampleBenchmark() { // Use random with the same seed, so that it generates the same data every // run. Random random = new Random(0); // Create the array once and copy it in benchmarks. Arrays.setAll(unsorted, (index) -> random.nextInt()); } @Test public void benchmark_quickSort() { final BenchmarkState state = benchmarkRule.getState(); int[] listToSort = new int[0]; while (state.keepRunning()) { // Copy the array with timing disabled to measure only the algorithm // itself. state.pauseTiming(); listToSort = Arrays.copyOf(unsorted, 10000); state.resumeTiming(); // Sort the array in place and measure how long it takes. SortingAlgorithms.quickSort(listToSort); } // Assert only once, not to add overhead to the benchmarks. assertTrue(SortingAlgorithmsKt.isSorted(listToSort)); }
Versuchen Sie, die Menge der Arbeit, die im measureRepeated
-Block und in runWithTimingDisabled
ausgeführt wird, zu minimieren. Der measureRepeated
-Block wird mehrmals ausgeführt und kann sich auf die Gesamtdauer des Benchmarks auswirken. Wenn Sie einige Ergebnisse eines Benchmarks überprüfen müssen, können Sie das letzte Ergebnis bestätigen, anstatt dies bei jeder Iteration des Benchmarks zu tun.
Benchmark ausführen
Führen Sie in Android Studio Ihren Benchmark wie jeden anderen @Test
aus. Verwenden Sie dazu die Gutter-Aktion neben Ihrer Testklasse oder -methode, wie in Abbildung 3 dargestellt.

Alternativ können Sie in der Befehlszeile den Befehl connectedCheck
ausführen, um alle Tests aus dem angegebenen Gradle-Modul auszuführen:
./gradlew benchmark:connectedCheck
Oder ein einzelner Test:
./gradlew benchmark:connectedCheck -P android.testInstrumentationRunnerArguments.class=com.example.benchmark.SampleBenchmark#benchmarkSomeWork
Benchmark-Ergebnisse
Nach einem erfolgreichen Microbenchmark-Lauf werden Messwerte direkt in Android Studio angezeigt. Ein vollständiger Benchmark-Bericht mit zusätzlichen Messwerten und Geräteinformationen ist im JSON-Format verfügbar.

JSON-Berichte und alle Profiling-Traces werden ebenfalls automatisch vom Gerät auf den Host kopiert. Sie werden auf dem Hostcomputer am folgenden Speicherort geschrieben:
project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/
Standardmäßig wird der JSON-Bericht auf dem Gerät im externen freigegebenen Medienordner des Test-APKs gespeichert, der sich normalerweise unter /storage/emulated/0/Android/media/**app_id**/**app_id**-benchmarkData.json
befindet.
Konfigurationsfehler
Die Bibliothek erkennt die folgenden Bedingungen, um sicherzustellen, dass Ihr Projekt und Ihre Umgebung für eine releasegenaue Leistung eingerichtet sind:
- „Debuggable“ ist auf
false
festgelegt. - Es wird ein physisches Gerät verwendet. Emulatoren werden nicht unterstützt.
- Zifferblätter sind gesperrt, wenn das Gerät gerootet ist.
- Der Akkustand des Geräts muss mindestens 25 % betragen.
Wenn eine der vorherigen Prüfungen fehlschlägt, wird im Benchmark ein Fehler gemeldet, um ungenaue Messungen zu vermeiden.
Wenn Sie bestimmte Fehlertypen als Warnungen unterdrücken und verhindern möchten, dass sie den Benchmark anhalten, übergeben Sie den Fehlertyp in einer durch Kommas getrennten Liste an das Instrumentierungsargument androidx.benchmark.suppressErrors
.
Sie können dies in Ihrem Gradle-Skript festlegen, wie im folgenden Beispiel gezeigt:
Kotlin
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
Groovy
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
Sie können Fehler auch über die Befehlszeile unterdrücken:
$ ./gradlew :benchmark:connectedCheck -P andoidtestInstrumentationRunnerArguments.androidx.benchmark.supperssErrors=DEBUGGABLE,LOW-BATTERY
Wenn Sie Fehler unterdrücken, wird der Benchmark in einem falsch konfigurierten Zustand ausgeführt. Die Ausgabe des Benchmarks wird absichtlich umbenannt, indem den Testnamen der Fehler vorangestellt wird. Wenn Sie beispielsweise einen debugfähigen Benchmark mit der Unterdrückung im vorherigen Snippet ausführen, wird den Testnamen DEBUGGABLE_
vorangestellt.
Empfehlungen für dich
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Makro-Benchmark schreiben
- Microbenchmarks ohne Gradle erstellen
- Baseline-Profile erstellen {:#creating-profile-rules}