Uygulama kodunuzda değişiklik yaparak Microbenchmark kitaplığını nasıl kullanacağınızı öğrenmek için Hızlı Başlangıç bölümüne bakın. Kod tabanınızda daha karmaşık değişiklikler yaparak tam kurulumu nasıl tamamlayacağınızı öğrenmek için Tam proje kurulumu bölümüne bakın.
Hızlı Başlangıç
Bu bölümde, kodu modüllere taşımanıza gerek kalmadan karşılaştırmayı nasıl deneyebileceğiniz ve tek seferlik ölçümlerin nasıl yapılacağı gösterilmektedir. Doğru performans sonuçları için bu adımlarda uygulamanızda hata ayıklama devre dışı bırakılır. Bu nedenle, değişiklikleri kaynak denetim sisteminize işlemeyin ve bu adımları yerel bir çalışma kopyasında uygulayın.
Tek seferlik karşılaştırma yapmak için aşağıdakileri uygulayın:
Kitaplığı, modülünüzün
build.gradle
veyabuild.gradle.kts
dosyasına ekleyin:Kotlin
dependencies { implementation("androidx.benchmark:benchmark-junit4:1.2.4") }
Groovy
dependencies { implementation 'androidx.benchmark:benchmark-junit4:1.2.4' }
androidTestImplementation
bağımlılığı yerineimplementation
bağımlılığı kullanın.androidTestImplementation
kullanıyorsanız kitaplık manifesti uygulama manifestiyle birleştirilmediği için karşılaştırmalar çalıştırılamaz.debug
derleme türünü hata ayıklanamayacak şekilde güncelleyin:Kotlin
android { ... buildTypes { debug { isDebuggable = false } } }
Groovy
android { ... buildTypes { debug { debuggable false } } }
testInstrumentationRunner
değeriniAndroidBenchmarkRunner
olarak değiştirin:Kotlin
android { ... defaultConfig { testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Groovy
android { ... defaultConfig { testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Karşılaştırmanızı eklemek için
BenchmarkRule
örneğiniandroidTest
dizinindeki bir test dosyasına ekleyin. Karşılaştırma yazma hakkında daha fazla bilgi için Mikro karşılaştırma sınıfı oluşturma başlıklı makaleyi inceleyin.Aşağıdaki kod snippet'inde, bir InstrumentedTest'e nasıl karşılaştırma ekleyeceğiniz gösterilmektedir:
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() ); } } }
Karşılaştırma yazmayı öğrenmek için Mikro karşılaştırma sınıfı oluşturma bölümüne gidin.
Tam proje kurulumu
Tek seferlik karşılaştırma yerine düzenli karşılaştırma ayarlamak için karşılaştırmaları kendi modüllerine ayırın. Bu, yapılandırmalarının (ör. debuggable
ayarını false
olarak belirleme) normal testlerden ayrı olmasını sağlar.
Microbenchmark, kodunuzu doğrudan çalıştırdığı için karşılaştırmak istediğiniz kodu ayrı bir Gradle modülüne yerleştirin ve bu modüldeki bağımlılığı Şekil 1'de gösterildiği gibi ayarlayın.

:app
,
:microbenchmark
ve :benchmarkable
Gradle modüllerini içeren uygulama yapısı. Bu yapı, Microbenchmark'ların :benchmarkable
modülündeki kodu karşılaştırmasına olanak tanır.Yeni bir Gradle modülü eklemek için Android Studio'daki modül sihirbazını kullanabilirsiniz. Sihirbaz, karşılaştırma için önceden yapılandırılmış bir modül oluşturur. Bu modüle bir karşılaştırma dizini eklenir ve debuggable
, false
olarak ayarlanır.
Android Studio'daki Project (Proje) panelinde projenizi veya modülünüzü sağ tıklayın ve New > Module'ü (Yeni > Modül) tıklayın.
Şablonlar bölmesinde Karşılaştırma'yı seçin.
Karşılaştırma modülü türü olarak Mikro karşılaştırma'yı seçin.
Modül adı olarak "microbenchmark" yazın.
Son'u tıklayın.

Modül oluşturulduktan sonra build.gradle
veya build.gradle.kts
dosyasını değiştirin ve karşılaştırma yapılacak kodu içeren modüle androidTestImplementation
ekleyin:
Kotlin
dependencies { // The module name might be different. androidTestImplementation(project(":benchmarkable")) }
Groovy
dependencies { // The module name might be different. androidTestImplementation project(':benchmarkable') }
Mikro karşılaştırma testi sınıfı oluşturma
Karşılaştırma ölçütleri, standart enstrümantasyon testleridir. Karşılaştırma oluşturmak için kitaplığın sağladığı BenchmarkRule
sınıfını kullanın. Etkinlikleri karşılaştırmak için ActivityScenario
veya ActivityScenarioRule
kullanın. Kullanıcı arayüzü kodunu karşılaştırmak için @UiThreadTest
kullanın.
Aşağıdaki kodda örnek bir karşılaştırma gösterilmektedir:
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(); } } }
Kurulum için zamanlamayı devre dışı bırakma
runWithTimingDisabled{}
bloğuyla ölçmek istemediğiniz kod bölümlerinde zamanlamayı devre dışı bırakabilirsiniz. Bu bölümler genellikle karşılaştırmanın her yinelemesinde çalıştırmanız gereken bazı kodları temsil eder.
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)); }
measureRepeated
bloğunda ve runWithTimingDisabled
içinde yapılan iş miktarını en aza indirmeye çalışın. measureRepeated
bloğu birden çok kez çalıştırılır ve bu durum, karşılaştırmayı çalıştırmak için gereken toplam süreyi etkileyebilir. Bir karşılaştırmanın bazı sonuçlarını doğrulamanız gerekiyorsa karşılaştırmanın her yinelemesinde yapmak yerine son sonucu onaylayabilirsiniz.
Karşılaştırmayı çalıştırma
Android Studio'da, Şekil 3'te gösterildiği gibi, test sınıfınızın veya yönteminizin yanındaki oluk işleminden yararlanarak @Test
ile yaptığınız gibi karşılaştırma testinizi çalıştırın.

Alternatif olarak, komut satırından connectedCheck
komutunu çalıştırarak belirtilen Gradle modülündeki tüm testleri çalıştırabilirsiniz:
./gradlew benchmark:connectedCheck
Veya tek bir test:
./gradlew benchmark:connectedCheck -P android.testInstrumentationRunnerArguments.class=com.example.benchmark.SampleBenchmark#benchmarkSomeWork
Karşılaştırma sonuçları
Başarılı bir Microbenchmark çalıştırmasından sonra metrikler doğrudan Android Studio'da gösterilir. Ek metrikler ve cihaz bilgilerini içeren tam bir karşılaştırma raporu JSON biçiminde kullanılabilir.

JSON raporları ve profil oluşturma izleri de cihazdan ana makineye otomatik olarak kopyalanır. Bunlar, ana makineye aşağıdaki konumda yazılır:
project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/
Varsayılan olarak, JSON raporu test APK'sının harici paylaşılan medya klasöründe cihazdaki diske yazılır. Bu klasör genellikle /storage/emulated/0/Android/media/**app_id**/**app_id**-benchmarkData.json
konumunda bulunur.
Yapılandırma hataları
Kitaplık, projenizin ve ortamınızın yayınlamaya hazır performans için ayarlandığından emin olmak üzere aşağıdaki koşulları algılar:
- Hata ayıklanabilir
false
olarak ayarlanır. - Fiziksel bir cihaz kullanılıyor (emülatörler desteklenmez).
- Cihaz rootlanmışsa saatler kilitlenir.
- Cihazın pil seviyesi en az %25 olmalıdır.
Önceki kontrollerden herhangi biri başarısız olursa karşılaştırma, yanlış ölçümleri önlemek için bir hata bildirir.
Belirli hata türlerini uyarı olarak bastırmak ve karşılaştırma testinin durdurulmasını önlemek için hata türünü virgülle ayrılmış bir listede enstrümantasyon bağımsız değişkenine androidx.benchmark.suppressErrors
iletin.
Bunu, aşağıdaki örnekte gösterildiği gibi Gradle komut dosyanızdan ayarlayabilirsiniz:
Kotlin
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
Groovy
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
Hataları komut satırından da bastırabilirsiniz:
$ ./gradlew :benchmark:connectedCheck -P andoidtestInstrumentationRunnerArguments.androidx.benchmark.supperssErrors=DEBUGGABLE,LOW-BATTERY
Hataların bastırılması, karşılaştırmanın yanlış yapılandırılmış bir durumda çalışmasına olanak tanır ve karşılaştırmanın çıkışı, test adlarının önüne hata eklenerek kasıtlı olarak yeniden adlandırılır. Örneğin, önceki snippet'te bastırma işlemiyle hata ayıklanabilir bir karşılaştırma testi çalıştırmak, test adlarının önüne DEBUGGABLE_
ekler.
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- Makro karşılaştırma testi yazma
- Gradle olmadan mikro kıyaslama oluşturma
- Temel profiller oluşturma {:#creating-profile-rules}