← Blog'a Dön

Performans Nasıl Ölçülür?

Performans Nasıl Ölçülür?
Hissetmek Yetmez, Ölçmek Gerekir
"Uygulama yavaş hissettiriyor" — bu cümle bir gözlemdir. Başlangıç noktası olarak değerlidir ama tek başına bir şeyi çözmez.
"Uygulama açılış süresi son sürümde 1.2 saniyeden 2.8 saniyeye çıktı, MainActivity'nin onCreate'i 340ms sürüyor ve bu sürenin 280ms'i üç kütüphane başlatmasından geliyor" — bu cümle ise bir teşhistir. Ve teşhis olmadan tedavi olmaz.
Performans ölçümü tahmini kesinliğe, hissi veriye dönüştürme sanatıdır.

Neyi Ölçmeli?
Ölçüm yapabilmek için önce neyin ölçüleceğini bilmek gerekir. Android performansı birkaç temel metrik etrafında şekillenir.
Başlangıç süresi kullanıcının uygulamayı ne kadar hızlı kullanabildiğini belirler. İki alt metriğe ayrılır. TTID (Time to Initial Display) kullanıcının ekranda ilk frame'i gördüğü anı ölçer. TTFD (Time to Full Display) uygulamanın tam anlamıyla etkileşime hazır hale geldiği anı ölçer. Bu ikisi arasındaki fark önemlidir çünkü ekran çizilmiş ama veri henüz yüklenmemiş olabilir.
Frame süresi ve frame hızı kullanıcı etkileşiminin akıcılığını tanımlar. Hedef saniyede 60 frame, yani her frame için 16ms altıdır. Dropped frame oranı ne kadar yüksekse kullanıcı deneyimi o kadar bozuktur.
Bellek tüketimi uygulamanın ne kadar RAM kullandığını ve bu kullanımın zaman içinde nasıl değiştiğini gösterir. Sürekli artan bellek bir sızıntının işaretidir.
Ağ performansı ne kadar istek atıldığını, bu isteklerin ne kadar sürdüğünü ve ne kadar veri transfer edildiğini ölçer. Fazla istek hem pil hem de kullanıcı verisi tüketir.
Pil tüketimi arka plan çalışmasının ve CPU kullanımının dolaylı yansımasıdır.

Android Studio Profiler: Temel Araç
Android Studio'nun içine entegre gelen Profiler, gerçek zamanlı performans verisi sunar ve her ciddi Android geliştiricisinin düzenli kullandığı araç olmalıdır.
CPU Profiler uygulamanızın işlemci kullanımını analiz eder. Hangi metodun ne kadar zaman harcadığını, hangi thread'lerin ne yaptığını gösterir. İki temel mod sunar. Sampled mode belirli aralıklarla thread durumlarını kaydeder, düşük overhead ile genel bir tablo verir. Instrumented mode her metot girişini ve çıkışını kaydeder, daha ayrıntılı ama daha yüksek overhead ile çalışır.
Bir kasma ya da ANR şüphesi yaşandığında CPU Profiler trace alınır, ilgili süre yakınlaştırılır ve UI thread'in nerede zaman harcadığı incelenir. Bunu bir kez deneyimleyen geliştirici, tahmin etmenin ne kadar verimsiz olduğunu anlar.
Memory Profiler bellek kullanımını gerçek zamanlı gösterir. Heap dump alarak bellekte hangi nesnelerin ne kadar yer kapladığını ve neden temizlenemediğini görselleştirir. Memory leak araştırmasında heap dump kaçınılmazdır. Dump alındıktan sonra hangi sınıftan kaç nesne var, bu nesneler neden hayatta, onlara kim referans tutuyor sorularının cevabı ekranda görünür.
Network Profiler tüm HTTP isteklerini kaydeder. İstek URL'leri, yanıt süreleri, yük boyutları, durum kodları — bunların tamamı zaman ekseninde görüntülenir. Fazla istek atılıyor mu, yanıtlar çok mu büyük, bazı istekler gereğinden sık mı tekrarlanıyor — bu soruların cevapları Network Profiler'da yatar.

Macrobenchmark: Gerçekçi Ölçüm
Android Studio Profiler geliştirme sırasında anlık analiz için idealdir. Ama sürümler arası karşılaştırma yapmak ve otomatik test süreçlerine entegre etmek için farklı bir araca ihtiyaç vardır: Jetpack Macrobenchmark.
Macrobenchmark, uygulamanızı gerçek production benzeri koşullarda ölçer. Debug değil release build çalıştırır. Uygulamayı dışarıdan başlatır ve açılış süresini, frame sürelerini, kaydırma performansını otomatik olarak ölçer.
Sürekli entegrasyon (CI) sürecine eklendiğinde her pull request'in performans etkisi otomatik olarak raporlanır. "Bu değişiklik açılış süresini 200ms uzattı" bilgisi kod review aşamasında görülür, production'a çıkmaz.
Baseline Profiles da Macrobenchmark ile birlikte çalışır. Uygulamanızın en sık kullanılan kod yolları önceden derlenerek cihaza hazır native kod olarak sunulur. Bu sayede soğuk başlatma süresi belirgin biçimde kısalır.

Systrace ve Perfetto: Derin Analiz
Profiler'ın gösteremediği sistem düzeyindeki etkileşimleri görmek için Perfetto kullanılır.
Perfetto, Android'in sistem genelindeki performans izleme aracıdır. CPU zamanlaması, GPU çalışması, bellek baskısı, Choreographer frame döngüleri, Binder çağrıları — bunların tamamı tek bir zaman ekseninde görselleştirilir. Çok katmanlı performans sorunlarını teşhis etmek için bu düzeyde bir görünürlük gerektiğinde Perfetto devreye girer.
Özellikle jank araştırmalarında Perfetto çok değerlidir. Hangi frame'in atlandığı, o frame sırasında UI thread'in ne yaptığı, RenderThread'in ne zaman GPU'ya teslim ettiği — bu zinciri bir arada görmek başka araçlarla mümkün değildir.

Google Play Console: Gerçek Kullanıcı Verisi
Kendi cihazınızda yaptığınız ölçümler değerlidir ama kısıtlıdır. Gerçek performans, gerçek kullanıcı cihazlarında ortaya çıkar.
Google Play Console'un Android Vitals bölümü üretim ortamındaki performans verilerini toplar ve raporlar. ANR oranı, crash oranı, başlangıç süresi dağılımı, frame düşme oranı — bunlar Play Store'da uygulamayı kullanan gerçek cihazlardan gelen verilerdir.
Android Vitals aynı zamanda uygulamanın Play Store'daki keşfedilebilirliğini etkiler. Kötü performans gösteren uygulamaların arama sonuçlarında ve uygulama önerilerinde görünürlüğü düşer. Bu tek başına performansa yatırım yapmanın yeterli gerekçesidir.

Geliştirici Perspektifinden Bakış
Performans ölçümünü olağandışı durumlarda yapılan bir aktivite olarak değil, geliştirme sürecinin doğal parçası olarak benimseyin.
Her büyük özellik geliştirmesinden önce mevcut performans metriklerini kaydedin. Geliştirme tamamlandığında aynı metrikleri tekrar ölçün. Fark varsa nedenini anlayın ve kabul edilemezse düzeltin. Bu döngü tutarlı biçimde uygulandığında performans regresyonları production'a ulaşmadan önce yakalanır.
Ölçüm araçlarını öğrenmek ilk başta zaman alır. Ama bir kez alışkanlık haline geldiğinde, performans sorunlarını sezgiyle aramak yerine doğrudan veriye bakarak bulmak hem çok daha hızlı hem de çok daha tatmin edici hale gelir.