kodu için Hızlı Başlangıç bölümüne bakın. Nasıl yapıldığını öğrenmek için daha karmaşık değişikliklerle tamamlandığında eksiksiz bir kurulum için Tam proje kurulumu bölümü.
Hızlı başlangıç kılavuzu
Bu bölümde, karşılaştırmayı nasıl deneyeceğiniz ve tek seferlik ölçümler nasıl çalıştırılacağı gösterilmektedir gerek kalmadan dilleri oyununuza ekleyin. Doğru performans sonuçları için Bu adımlar uygulamanızda hata ayıklamanın devre dışı bırakılmasını gerektirir. Bu nedenle, bunu yerel bir çalışan kopya üzerinde çalışır.
Tek seferlik karşılaştırma yapmak için aşağıdakileri yapı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") }
Eski
dependencies { implementation 'androidx.benchmark:benchmark-junit4:1.2.4' }
androidTestImplementation
yerineimplementation
bağımlılığı kullanın desteklenmektedir.androidTestImplementation
kullanırsanız karşılaştırmalar manifest kitaplık uygulamayla birleştirilmediği için çalıştırma manifest'ini kullanabilirsiniz.debug
derleme türünü hata ayıklama yapılamayacak şekilde güncelleyin:Kotlin
android { ... buildTypes { debug { isDebuggable = false } } }
Eski
android { ... buildTypes { debug { debuggable false } } }
testInstrumentationRunner
değeriniAndroidBenchmarkRunner
olacak şekilde değiştirin:Kotlin
android { ... defaultConfig { testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Eski
android { ... defaultConfig { testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Bir test dosyasına
BenchmarkRule
örneğini ekleyin: Karşılaştırmanızı eklemek içinandroidTest
dizini. Okuyucu Gelirleri Yöneticisi'ni karşılaştırma yazma hakkında daha fazla bilgi için Mikrobenchmark sınıfı oluşturma başlıklı makaleyi inceleyin.Aşağıdaki kod snippet'i, karşılaştırmanın test:
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 yazma hakkında bilgi edinmek 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 normal karşılaştırmayı ayarlamak için
kendi modüllerinde kullanabilirsiniz. Bu da yapılandırmalarının,
(debuggable
değerini false
olarak ayarlamak gibi) normal testlerden ayrıdır.
Microbenchmark kodunuzu doğrudan çalıştırdığından, ayrı bir Gradle modülünde karşılaştırmalı ve bu modüle bağımlılığı Şekil 1'de gösterilmiştir.
Yeni bir Gradle modülü eklemek için Android Studio'daki modül sihirbazını kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan
sihirbaz, karşılaştırma için önceden yapılandırılmış bir modül oluşturur.
karşılaştırma dizini eklendi ve debuggable
, false
olarak ayarlandı.
Android Studio'daki Proje panelinde projenizi veya modülünüzü sağ tıklayın ve 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 Mikrobenchmark'ı seçin.
"microbenchmark" yazın seçeneğini tıklayı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 yapmak için kodu içeren modüle androidTestImplementation
ekleyin:
Kotlin
dependencies { // The module name might be different. androidTestImplementation(project(":benchmarkable")) }
Eski
dependencies { // The module name might be different. androidTestImplementation project(':benchmarkable') }
Mikro karşılaştırma sınıfı oluşturma
Karşılaştırmalar, standart araç testleridir. Karşılaştırma oluşturmak için
Kitaplık tarafından BenchmarkRule
sınıfı sağlandı. Etkinlikleri karşılaştırmak için
ActivityScenario
veya ActivityScenarioRule
. Karşılaştırma kullanıcı arayüzü kodu için
@UiThreadTest
kullanın.
Aşağıdaki kod örnek bir karşılaştırmayı gösterir:
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ırak
runWithTimingDisabled{}
blok. Bu bölümler genellikle bir
Karşılaştırmanın her yinelemesinde çalıştırmanız gereken kod.
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 yapılan iş miktarını en aza indirmeye çalışın.
ve runWithTimingDisabled
içinde. measureRepeated
bloğu birden fazla çalıştırılıyor
zaman alır ve karşılaştırmayı çalıştırmak için gereken toplam süreyi etkileyebilir. Şu durumda:
Karşılaştırmanın bazı sonuçlarını doğrulamak istiyorsanız, en son
bunu her karşılaştırmada tekrarlamak yerine.
Karşılaştırma yapın
Android Studio'da, şunu kullanarak karşılaştırmanızı herhangi bir @Test
ile aynı şekilde çalıştırın:
oluk eylemini, Şekil 3'te gösterildiği gibi test sınıfınızın veya yönteminizin yanına ekleyin.
Alternatif olarak, tüm komut dosyalarını çalıştırmak için komut satırından connectedCheck
sayısı:
./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ışmasından sonra, metrikler doğrudan Android'de görüntüleniyor Studio ve ek metrikler ve cihaz içeren tam bir karşılaştırma raporu bilgileri JSON biçiminde sunulur.
JSON raporları ve profil oluşturma izleri de cihazdan otomatik olarak kopyalanır belirler. Bunlar, ana makinede aşağıdaki konumda yazılır:
project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/
JSON raporu, varsayılan olarak test APK'sının
harici bir paylaşılan medya klasöründe bulunur ve bu klasör
/storage/emulated/0/Android/media/**app_id**/**app_id**-benchmarkData.json
Yapılandırma hataları
Kitaplık, projenizin ve ortamın sürümle doğru performans sağlayacak şekilde ayarlandığından emin olmak için aşağıdaki koşulları algılar:
- Hata ayıklanabilir
false
olarak ayarlandı. - Fiziksel bir cihaz kullanılıyor ve emülatörler desteklenmiyor.
- 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, hatalı ölçümleri önlemek için bir hata bildirir.
Belirli hata türlerini uyarı olarak bastırmak ve
karşılaştırma yapmak için, hata türünü araca virgülle ayrılmış bir liste şeklinde iletin
androidx.benchmark.suppressErrors
bağımsız değişkeni.
Bunu, aşağıdaki örnekte gösterildiği gibi Gradle komut dosyanızdan ayarlayabilirsiniz:
Kotlin
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
Eski
android { defaultConfig { … testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "DEBUGGABLE,LOW-BATTERY" } }
Ayrıca, komut satırından hataları da gizleyebilirsiniz:
$ ./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ını sağlar ve karşılaştırmanın çıkışı, test adlarının başına hatanın eklenmesi yoluyla kasıtlı olarak yeniden adlandırılır. Örneğin,
önceki snippet'teki engelleme seçeneği, test adlarının başına DEBUGGABLE_
ekler.
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Macrobenchmark yazma
- Gradle olmadan Microbenchmark'lar derleyin
- Temel profiller oluşturma {:#creating-profile-rules}