Mikro Karşılaştırma Yazma

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:

  1. Kitaplığı, modülünüzün build.gradle veya build.gradle.kts dosyasına ekleyin:

    Kotlin

    dependencies {
        implementation("androidx.benchmark:benchmark-junit4:1.2.3")
    }
    

    Eski

    dependencies {
        implementation 'androidx.benchmark:benchmark-junit4:1.2.3'
    }
    

    androidTestImplementation yerine implementation 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.

  2. debug derleme türünü, hata ayıklaması mümkün olmayacak şekilde güncelleyin:

    Kotlin

    android {
        ...
        buildTypes {
            debug {
                isDebuggable = false
            }
        }
    }
    

    Eski

    android {
        ...
        buildTypes {
            debug {
                debuggable false
            }
        }
    }
    
  3. testInstrumentationRunner değerini AndroidBenchmarkRunner olacak şekilde değiştirin:

    Kotlin

    android {
        ...
        defaultConfig {
            testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner"
        }
    }
    

    Eski

    android {
        ...
        defaultConfig {
            testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner"
        }
    }
    
  4. Bir test dosyasına BenchmarkRule örneğini ekleyin: Karşılaştırmanızı eklemek için androidTest 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.

uygulama yapısı
Şekil 1. :app ile uygulama yapısı, :microbenchmark ve :benchmarkable Gradle özelliklerini de kullanabilmenizi sağlar. :benchmarkable modülünü kullanabilirsiniz.

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ı.

  1. Android'de Proje panelinde projenizi veya modülünüzü sağ tıklayın Studio'yu seçin ve Yeni > Modül.

  2. Şablonlar bölmesinde Karşılaştırma'yı seçin.

  3. Karşılaştırma modülü türü olarak Mikrobenchmark'ı seçin.

  4. "microbenchmark" yazın seçeneğini tıklayın.

  5. Son'u tıklayın.

ziyaret edin.
Yeni kitaplık modülünü yapılandır
Şekil 2. Android Studio'ya yeni bir Gradle modülü ekle Yaban arısı.

Modül oluşturulduktan sonra build.gradle veya build.gradle.kts değerini değiştirin dosyasını yükleyin ve androidTestImplementation öğesini, aşağıdaki kodu içeren modüle ekleyin: karşılaştırma:

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ı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 sonucu 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.

Microbenchmark&#39;ı çalıştır
Şekil 3. Oluk işlemini kullanarak Microbenchmark testini çalıştırın tıklayın.

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.

Mikrobenchmark sonuçları
Şekil 4. Microbenchmark sonuçları.

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 ekibinizin ortamının doğru şekilde yayınlandığından emin olun:

  • Hata ayıklanabilir false olarak ayarlandı.
  • Fiziksel bir cihaz kullanılıyor ve emülatörler desteklenmiyor.
  • Cihaz rootlanmışsa saatler kilitlenir.
  • Cihazda en az %25'lik yeterli pil seviyesi.

Önceki kontrollerden herhangi biri başarısız olursa karşılaştırma, hatalı ölçümlerden kaçınmanıza yardımcı olur.

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 atlanması, 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 uygulanarak kasıtlı olarak 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.

ziyaret edin.