kodu için Hızlı Başlangıç bölümüne bakın. Kod tabanınızda daha karmaşık değişiklikler içeren tam bir 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, 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ımlarda uygulamanızda hata ayıklamanın devre dışı bırakılması gerekir. Bu nedenle, değişiklikleri kaynak denetim sisteminize kaydetmeden bu dosyayı yerel bir çalışma kopyasında tutun.
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 } } }
Groovy
android { ... buildTypes { debug { debuggable false } } }
testInstrumentationRunner
değeriniAndroidBenchmarkRunner
olarak değiştirin:Kotlin
android { ... defaultConfig { testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Eski
android { ... defaultConfig { testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner" } }
Karşılaştırmanızı eklemek için
androidTest
dizininde bir test dosyasınaBenchmarkRule
örneği ekleyin. 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'inde, bir Ölçülmüş teste nasıl karşılaştırma ölçütü ekleneceği 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 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, debuggable
değerinin false
olarak ayarlanması gibi yapılandırmalarının normal testlerden ayrı olmasını sağlar.
Microbenchmark, kodunuzu doğrudan çalıştırdığından, karşılaştırma yapmak istediğiniz kodu ayrı bir Gradle modülüne yerleştirin ve bu modüle bağımlılığı Şekil 1'de gösterildiği gibi ayarlayın.
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'de Proje panelinde projenizi veya modülünüzü sağ tıklayın Studio'yu seçin ve Yeni > Modül.
Ş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.
"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') }
Microbenchmark sınıfı oluşturma
Karşılaştırma ölçütleri, standart enstrümantasyon 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
simgesini kullanın. Kullanıcı arayüzü kodunu karşılaştırmak için @UiThreadTest
değerini 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
Ölçmek istemediğiniz kod bölümlerinin zamanlamasını runWithTimingDisabled{}
bloğuyla devre dışı bırakabilirsiniz. Bu bölümler genellikle karşılaştırmanın her iterasyonunda ç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 yapılan iş miktarını en aza indirmeye çalışın.
ve runWithTimingDisabled
içinde. measureRepeated
bloğu birden çok kez çalıştırılır ve 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 iterasyonunda doğrulama yapmak yerine son sonucu doğrulayabilirsiniz.
Karşılaştırmayı çalıştırma
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ı
Mikro karşılaştırma başarılı bir şekilde çalıştırıldıktan sonra metrikler doğrudan Android Studio'da görüntülenir ve ek metrikler ile cihaz bilgilerini içeren tam bir karşılaştırma raporu JSON biçiminde kullanılabilir.
JSON raporları ve tüm profil oluşturma izleri de cihazdan ana makineye otomatik olarak kopyalanır. Bunlar, ana makinede aşağıdaki konuma 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 ekibinizin ortamının doğru şekilde yayınlandığından emin olun:
- Hata ayıklama yapılabilir özelliği
false
olarak ayarlanmıştır. - Fiziksel bir cihaz kullanılıyorsa (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 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 engellenmesi, karşılaştırmanın yanlış yapılandırılmış bir durumda çalıştırılmasına olanak tanır.
ve karşılaştırmanın çıktısı, önceden test edilerek yeniden adlandırılır.
içeren bir e-posta alırsınız. Ö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 mikro karşılaştırma oluşturma
- Temel Profiller Oluşturma {:#create-profile-rules}