0Pricing
Android Academy · Ders

Performansı Ölçme

Profil oluşturucular, izlemeler ve karşılaştırmalar.

Performansı Ölçme, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.

En İyileştirmeden Önce Ölçün

Performans çalışmalarının altın kuralı: önce ölçün, asla tahmin etmeyin. Neyin yavaş olduğuna dair insan sezgisi neredeyse her zaman yanılır.

Bu derste Android'in performansı görmenizi sağlayan araçlarını öğreneceksiniz: profil oluşturucular, sistem izleri ve mikro karşılaştırmalar. Ölçebildiğinizde her en iyileştirme, bir tahmin yerine veriye dayalı bir karara dönüşür.

  • Profil oluşturucular, CPU'yu, belleği ve enerji kullanımını gerçek zamanlı gösterir.
  • Sistem izleri, her karenin zamanının tam olarak nereye gittiğini ortaya çıkarır.
  • Karşılaştırmalar, derlemeler arasında karşılaştırabileceğiniz tekrarlanabilir sayılar sağlar.

16 ms'lik Kare Bütçesi

60 Hz'lik bir ekranda sistem her 16,67 ms'de bir yeni kare çizer. Uygulamanız bu süre içinde bir kareyi hazırlayamazsa kare atlanır ve kullanıcılar bunu takılma olarak algılar. 120 Hz'lik cihazlarda bu bütçe yaklaşık 8 ms'ye düşer.

Performans çalışması aslında bu bütçenin içinde kalmakla ilgilidir. Aşağıdaki yorum, zihninizde sürekli yaptığınız hesabı gösterir.

// Frame budget math
// 60 Hz  -> 1000ms / 60  = 16.67ms per frame
// 90 Hz  -> 1000ms / 90  = 11.11ms per frame
// 120 Hz -> 1000ms / 120 =  8.33ms per frame
//
// Exceed the budget on the UI thread = a dropped frame = visible jank.
fun frameBudgetMs(refreshHz: Int): Double = 1000.0 / refreshHz

fun main() {
    println("60Hz  -> %.2f ms".format(frameBudgetMs(60)))
    println("120Hz -> %.2f ms".format(frameBudgetMs(120)))
}

Android Studio Profilleyicisi

Android Studio Profilleyicisi (Görünüm > Araç Pencereleri > Profilleyici), çalışan bir uygulamaya bağlanır ve CPU, Bellek, Enerji ve Ağ için canlı zaman çizelgeleri gösterir.

  • CPU: yoğun kod yollarını bulmak için yöntem izlerini ve sistem izlerini kaydedin.
  • Bellek: sızıntıları bulmak için bellek ayırmalarını izleyin ve yığın dökümleri alın.
  • Enerji: pili tüketen uyanık tutma kilitlerini ve aşırı işleri belirleyin.

Her zaman gerçek bir cihazda sürüm derlemesine uygun bir derlemeyi profilleyin. Hata ayıklama derlemelerinde ve emülatörlerde iyileştirmeler devre dışı olduğundan yanıltıcı değerler elde edilir.

Gerçek Senaryolar için Makrobenchmark

Jetpack Makrobenchmark kitaplığı, gerçek bir cihazda tüm kullanıcı yolculuklarını (başlangıç, kaydırma, gezinme) ölçer ve kare zamanlaması ile başlangıç süresi gibi kararlı ölçümler bildirir.

Uygulamanızı başlatan ve bir akışı çalıştıran bir test yazarsınız; kitaplık bunu birçok kez çalıştırır ve ortanca ile 99. yüzdelik dilim değerlerini verir.

@RunWith(AndroidJUnit4::class)
class StartupBenchmark {
    @get:Rule val rule = MacrobenchmarkRule()

    @Test
    fun coldStartup() = rule.measureRepeated(
        packageName = "com.example.app",
        metrics = listOf(StartupTimingMetric()),
        iterations = 5,
        startupMode = StartupMode.COLD
    ) {
        pressHome()
        startActivityAndWait()
    }
}

Yoğun Kod için Mikrobenchmark

Tek bir işlevin ne kadar hızlı olduğunu bilmeniz gerektiğinde Mikrobenchmark kitaplığını kullanın. Kodunuzu sıkı bir döngüde çalıştırır, JIT'i ısıtır ve gürültüyü ayıklayarak işlem başına nanosaniye değerlerini bildirir.

Bunu ayrıştırıcılar, serileştiriciler, sıralama veya sıkça çağırdığınız CPU'ya bağlı yardımcılar için kullanın.

@RunWith(AndroidJUnit4::class)
class JsonParseBenchmark {
    @get:Rule val benchmarkRule = BenchmarkRule()

    @Test
    fun parseLargePayload() {
        val raw = loadSampleJson()
        benchmarkRule.measureRepeated {
            val parsed = parseUsers(raw) // code under test
            // assertEquals avoids the compiler dropping the result
            assertTrue(parsed.isNotEmpty())
        }
    }
}

Perfetto ile Sistem İzleme

Sistem izleme, her iş parçacığının ve sistemin kare kare ne yaptığını kaydeder. Android Studio'nun CPU profilleyicisi bir iz kaydedebilir; ayrıca adb ile de kayıt alıp bunu Perfetto (ui.perfetto.dev) içinde açabilirsiniz.

Bir iz, korkulan kırmızı kareleri, ana iş parçacığındaki çalışmayı ve GPU'da geçirilen süreyi gösterir. Takılmayı teşhis etmek için en iyi tek araçtır.

# Record a 5-second system trace from the command line
adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto-trace \
  -t 5s sched freq idle am wm gfx view

# Pull it to your machine, then open in https://ui.perfetto.dev
adb pull /data/misc/perfetto-traces/trace.perfetto-trace

Özel İz Bölümleri

Varsayılan olarak izlerde çerçevenin çalışması gösterilir. Kendi kodunuzu etiketlemek için onu adlandırılmış bir iz bölümünün içine alın. Bu adlar daha sonra Perfetto'da etiketli bloklar olarak görünür ve yoğun noktalarınızı kolayca belirlemenizi sağlar.

Bölümlerin hem hata ayıklama hem de karşılaştırma izlerinde görünmesi için androidx.tracing API'sini kullanın.

import androidx.tracing.trace

fun loadDashboard(repo: Repo): Dashboard {
    return trace("loadDashboard") {
        val user = trace("fetchUser") { repo.user() }
        val feed = trace("fetchFeed") { repo.feed() }
        Dashboard(user, feed)
    }
}
// In Perfetto you will now see named slices:
// loadDashboard > fetchUser, fetchFeed

Çalışma Zamanında Atlanan Kareleri İzleme

Her zaman bağlı bir profilleyiciniz olmayabilir. JankStats, çalışan uygulamanızın içinden takılmalı kareleri bildiren bir Jetpack kitaplığıdır; böylece bunları günlüğe kaydedebilir veya toplu verileri analiz sistemine gönderebilirsiniz.

Pencereye bağlanır ve bir kare bütçesini aştığında sizi geri çağırır.

val jankStats = JankStats.createAndTrack(window) { frameData ->
    if (frameData.isJank) {
        Log.w("Jank", "Janky frame: ${frameData.frameDurationUiNanos} ns")
        analytics.logJank(frameData.frameDurationUiNanos)
    }
}

// Pause/resume with your screen lifecycle
override fun onResume() { super.onResume(); jankStats.isTrackingEnabled = true }
override fun onPause() { super.onPause(); jankStats.isTrackingEnabled = false }

Sayıları Okuma: Yüzdelik Dilimler

Tek bir ortalama, sorunları gizler. Ortalama kareniz 10 ms, ancak 99. yüzdelik dilim 40 ms ise karelerin %1'i takılmalıdır ve kullanıcılar bunu hisseder. Yalnızca ortalamaya değil, her zaman P50, P90, P99 değerlerine bakın.

Karşılaştırmalar bu değerleri sizin için bildirir. Aşağıdaki yardımcı, ham kare örnekleri üzerinde bu fikri gösterir.

fun percentile(samplesMs: List<Double>, p: Int): Double {
    val sorted = samplesMs.sorted()
    val index = ((p / 100.0) * (sorted.size - 1)).toInt()
    return sorted[index]
}

fun main() {
    val frames = listOf(8.0, 9.0, 10.0, 9.5, 11.0, 40.0, 9.0, 10.5)
    println("P50 = %.1f ms".format(percentile(frames, 50)))
    println("P99 = %.1f ms".format(percentile(frames, 99)))
}

Tekrarlanabilir Bir Ölçüm İş Akışı

Güvenilir değerler, disiplinli bir süreçten elde edilir. Bu kontrol listesini her seferinde uygulayın:

  • sürüm / hata ayıklanamaz bir derleme kullanın (R8 etkin).
  • Fiziksel bir cihazda, cihaz prize takılıyken ve sıcaklık durumu sabitken çalıştırın.
  • Senaryoyu birkaç kez tekrarlayın ve ortancayı bildirin.
  • Her seferinde tek bir şeyi değiştirip yeniden ölçün.
  • İyileşmeyi kanıtlayabilmek için kaydedilmiş bir temel değerle karşılaştırın.

Bunları atlarsanız gerçek sorunları çözmek yerine gürültünün peşinden koşarsınız.

Zaman Gerçekte Nereye Gidiyor

Android'deki takılmaların çoğu az sayıdaki nedenden kaynaklanır. Bunları bilmek, araçlarınızı nereye yönelteceğinizi gösterir:

  • Ana iş parçacığındaki çalışma: kullanıcı arayüzü iş parçacığında disk/ağ/JSON işlemleri.
  • Aşırı yeniden oluşturma: Compose'un gereğinden çok şeyi yeniden çizmesi.
  • Bellek ayırma yoğunluğu: çöp toplama duraklamaları.
  • Yerleşim geçişleri: derin biçimde iç içe geçmiş veya tekrar tekrar ölçülen yerleşimler.

Bu kurstaki sonraki dersler yeniden oluşturmayı, bellek sızıntılarını ve başlangıcı doğrudan ele alır. Önce hangisini düzeltmeniz gerektiğini size ölçüm gösterir.

Hızlı Kontrol

Uygulamanızın gerçek bir cihazdaki soğuk başlangıcının ne kadar sürdüğünü birden çok çalıştırma boyunca kararlı ve tekrarlanabilir biçimde ölçmek istiyorsunuz. Hangi araç en uygundur?

Özet: Artık Ölçüm Yapabilirsiniz

Herhangi bir şeyi değiştirmeden önce performansı görünür kılmayı öğrendiniz:

  • 16 ms'lik kare bütçesi, akıcı olanla takılmalı olanı belirler.
  • Android Studio Profilleyicisi, canlı CPU, bellek ve enerji verilerini gösterir.
  • Makro ve mikro karşılaştırmalar tekrarlanabilir değerler sağlar.
  • Perfetto izleri ve özel trace() bölümleri zamanın nereye gittiğini ortaya çıkarır.
  • JankStats, çalışan uygulamanın içinden takılmaları bildirir.
  • P50/P90/P99 değerlerini okuyun, sürüm derlemelerini gerçek cihazlarda profilleyin ve her seferinde tek bir şeyi değiştirin.

Sırada bunu Compose takılmalarının en büyük kaynaklarından biri olan yeniden oluşturma işlemine uygulayacağız.

Sıkça Sorulan Sorular

“Performansı Ölçme” dersi ücretsiz mi?

Evet — “Performansı Ölçme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.

“Performansı Ölçme” dersinde ne öğreneceğim?

Profil oluşturucular, izlemeler ve karşılaştırmalar. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Android Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Performansı Ölçme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Performansı Ölçme
  2. Yeniden Oluşturmayı Denetleme
  3. Bellek Sızıntıları ve Çözümleri
  4. Başlangıç ve Temel Profiller
← Android Academy Sayfasına Dön