Macrobenchmark metriklerini yakalama

Metrikler, karşılaştırmalarınızdan elde edilen ana bilgi türüdür. Bunlar, measureRepeated işlevine List olarak iletilir. Bu sayede, aynı anda birden fazla ölçülen metrik belirtebilirsiniz. Karşılaştırmanın çalıştırılması için en az bir metrik türü gereklidir.

Aşağıdaki kod snippet'inde kare zamanlaması ve özel izleme bölümü metrikleri yakalanır:

Kotlin

benchmarkRule.measureRepeated(
    packageName = TARGET_PACKAGE,
    metrics = listOf(
        FrameTimingMetric(),
        TraceSectionMetric("RV CreateView"),
        TraceSectionMetric("RV OnBindView"),
    ),
    iterations = 5,
    // ...
)

Java

benchmarkRule.measureRepeated(
    TARGET_PACKAGE,     // packageName
    Arrays.asList(      // metrics
        new StartupTimingMetric(),
        new TraceSectionMetric("RV CreateView"),
        new TraceSectionMetric("RV OnBindView"),
    ),
    5,                  // Iterations
    // ...
);

Bu örnekte RV CreateView ve RV OnBindView, RecyclerView içinde tanımlanan izlenebilir blokların kimlikleridir. createViewHolder() yönteminin kaynak kodu, kendi kodunuzda nasıl izlenebilir bloklar tanımlayabileceğinize dair bir örnektir.

StartupTimingMetric, TraceSectionMetric, FrameTimingMetric ve PowerMetric, bu dokümanın ilerleyen bölümlerinde ayrıntılı olarak ele alınmaktadır.

Karşılaştırma sonuçları, Şekil 1'de gösterildiği gibi Android Studio'ya gönderilir. Birden fazla metrik tanımlanırsa bunların tümü çıktıda birleştirilir.

TraceSectionMetric ve FrameTimingMetric'in sonuçları.
Şekil 1. TraceSectionMetric ve FrameTimingMetric sonuçları.

StartupTimingMetric

StartupTimingMetric aşağıdaki değerlerle uygulama başlatma zamanlaması metriklerini yakalar:

  • timeToInitialDisplayMs: Sistemin bir başlatma amacı almasından hedefin ilk karesini oluşturmasına kadar geçen süre Activity.
  • timeToFullDisplayMs: Sistemin bir başlatma amacı almasından uygulamanın reportFullyDrawn() yöntemi kullanılarak tamamen çizildiğini bildirmesine kadar geçen süre. Ölçüm, reportFullyDrawn() çağrısından sonra veya reportFullyDrawn() çağrısını içeren ilk karenin oluşturulmasının tamamlanmasıyla durur. Bu ölçüm, Android 10 (API düzeyi 29) ve önceki sürümlerde kullanılamayabilir.

StartupTimingMetric, başlangıç iterasyonlarındaki minimum, medyan ve maksimum değerleri döndürür. Tipik başlatma süresiyle ilgili en iyi tahmini sağladıkları için, başlatma süresindeki iyileşmeyi değerlendirmek üzere ortanca değerlere odaklanmanız gerekir. Uygulama başlatma süresini etkileyen faktörler hakkında daha fazla bilgi için Uygulama başlatma süresi başlıklı makaleyi inceleyin.

StartupTimingMetric sonuçları
Şekil 2. StartupTimingMetric sonuç.

FrameTimingMetric

FrameTimingMetric, bir karşılaştırma tarafından oluşturulan karelerden (ör. kaydırma veya animasyon) zamanlama bilgilerini yakalar ve aşağıdaki değerleri döndürür:

  • frameOverrunMs: Belirli bir karenin son tarihini kaçırdığı süre. Pozitif sayılar, atlanan kare ve görünür sarsıntı veya takılma olduğunu gösterir. Negatif sayılar, bir karenin son tarihten ne kadar daha hızlı olduğunu gösterir. Not: Bu özellik yalnızca Android 12 (API düzeyi 31) ve sonraki sürümlerde kullanılabilir.
  • frameDurationCpuMs: Karenin hem kullanıcı arayüzü iş parçacığında hem de RenderThread'da CPU'da üretilmesi için geçen süre.

Bu ölçümler 50., 90., 95. ve 99. yüzdelik dilim dağılımında toplanır.

Yavaş kareleri tespit etme ve iyileştirme hakkında daha fazla bilgi için Yavaş oluşturma başlıklı makaleyi inceleyin.

FrameTimingMetric sonuçları
Şekil 3. FrameTimingMetric sonuç.

TraceSectionMetric

TraceSectionMetric sağlanan sectionName ile eşleşen bir izleme bölümünün kaç kez gerçekleştiğini ve bu işlemin ne kadar sürdüğünü yakalar. Süre için milisaniye cinsinden minimum, medyan ve maksimum süreleri gösterir. İzleme bölümü, trace(sectionName) işlev çağrısı veya Trace.beginSection(sectionName) ile Trace.endSection() arasındaki kod ya da bunların ayarsız varyantları tarafından tanımlanır. Her zaman bir ölçüm sırasında yakalanan izleme bölümünün ilk örneğini seçer. Varsayılan olarak yalnızca paketinizdeki izleme bölümlerini gösterir. Paketinizin dışındaki işlemleri dahil etmek için targetPackageOnly = false değerini ayarlayın.

İzleme hakkında daha fazla bilgi için Sistem izlemeye genel bakış ve Özel etkinlikleri tanımlama başlıklı makaleleri inceleyin.

TraceSectionMetric
Şekil 4. TraceSectionMetric sonuç.

PowerMetric

PowerMetric, sağlanan güç kategorileri için test süreniz boyunca güç veya enerjideki değişikliği yakalar. Seçilen her kategori, ölçülebilir alt bileşenlerine ayrılır ve seçilmeyen kategoriler "seçilmedi" metriğine eklenir.

Bu metrikler, uygulama başına tüketimi değil sistem genelindeki tüketimi ölçer ve Pixel 6, Pixel 6 Pro ve sonraki modellerle sınırlıdır:

  • power<category>Uw: Bu kategorideki testiniz sırasında tüketilen güç miktarı.
  • energy<category>Uws: Bu kategorideki testinizin süresi boyunca birim zaman başına aktarılan enerji miktarı.

Kategoriler arasında şunlar yer alır:

  • CPU
  • DISPLAY
  • GPU
  • GPS
  • MEMORY
  • MACHINE_LEARNING
  • NETWORK
  • UNCATEGORIZED

CPU gibi bazı kategorilerde, diğer işlemlerin yaptığı işi kendi uygulamanızın yaptığı işten ayırmak zor olabilir. Girişimi en aza indirmek için gereksiz uygulamaları ve hesapları kaldırın veya kısıtlayın.

PowerMetric sonuçları
Şekil 5. PowerMetric sonuç.