Ünite 8 / 11

Performans ve Pil Optimizasyonu: Yapay Zeka ile Hızlı ve Verimli Uygulamalar

Kazanimlar:

  • Önce profil alıp gerçek darboğazı ölçerek, tahmine değil veriye dayalı optimizasyon yapabilme ve profil çıktısını yapay zekaya yorumlatabilme
  • Başlangıç süresi, akıcılık, bellek ve pil eksenlerinde en pahalı işlemi hedefleyip ağır işi ana iş parçacığından çıkarabilme
  • Cihaz üzeri model ve bulut çağrısı gibi yapay zeka yeteneklerinin pil ve işlemci maliyetini örnekleme ve toplu işlemle yönetebilme

Mobil kullanıcı sabırsızdır. Uygulama yavaş açılıyorsa, kaydırırken takılıyorsa veya pili hızla tüketiyorsa, kullanıcı onu siler ve mağazada bir yıldız verir. Performans ve pil verimliliği, bir mobil uygulamanın hayatta kalma meselesidir; hem kullanıcı memnuniyetini hem mağaza sıralamasını doğrudan etkiler. YZ, performans darboğazlarını (bottleneck — sistemi yavaşlatan tıkanma noktası) tespit etmekte, ölçüm sonuçlarını yorumlamakta ve optimizasyon önermekte güçlü bir yardımcıdır. Ama altın kural değişmez: önce ölç, sonra optimize et. Bu ünitede YZ ile performans ve pil sorunlarını veriye dayalı biçimde çözmeyi öğreneceğiz. Özellikle önemli bir konu, önceki ünitelerde eklediğimiz YZ yeteneklerinin (cihaz üzeri model, bulut çağrısı) pil ve performansa etkisini yönetmektir.

Ölçmeden optimize etme

Deneyimsiz geliştiricinin en büyük hatası, tahmine dayalı optimizasyondur: "şurası yavaştır herhalde" deyip vakit harcamak. Gerçek darboğaz neredeyse her zaman beklenmedik bir yerdedir. Bu yüzden önce profil alınır (profiling — uygulamanın hangi kısmının ne kadar zaman/bellek/pil harcadığını ölçme). Android Studio Profiler ve Xcode Instruments bu iş içindir. Ölçüm verisini YZ'ye vermek, yorumlamayı hızlandırır; ama ölçüm olmadan YZ'ye "uygulamam yavaş, hızlandır" demek, körlemesine tahmin ürettirmektir.

Performansın dört ana ekseni:

Eksen

Belirti

Tipik sebep

Başlangıç süresi

Uygulama geç açılıyor

Ana iş parçacığında ağır iş

Akıcılık (jank)

Kaydırma takılıyor

UI thread'de uzun işlem, gereksiz yeniden çizim

Bellek

Şişme, çökme

Sızıntı, büyük görsel, önbellek kontrolsüz

Pil/ısı

Hızlı boşalma

Sürekli konum, ağ, sensör, arka plan işi

İpucu: YZ'ye bir performans sorunu sorarken profil çıktısını (hangi fonksiyon ne kadar sürüyor, bellek grafiği) verin. "Şu fonksiyon her karede 30ms sürüyor" gibi somut veri, YZ'nin gerçek darboğaza odaklanmasını sağlar; "yavaş" gibi öznel ifade genel ve işe yaramaz cevap üretir.

YZ yeteneklerinin pil maliyeti

Bu modülde eklediğimiz YZ özellikleri güçlüdür ama bedava değildir. Cihaz üzeri bir model çıkarımı işlemciyi ve pili yorar; sürekli çalışan bir görüntü tanıma (örneğin her kareyi işleyen kamera) telefonu ısıtır ve pili dakikalar içinde tüketir. Bulut YZ çağrıları ise ağ radyosunu (network radio — veri gönderip alan anten) sürekli açık tutarak pili yer. Çözümler: cihaz üzeri modeli yalnızca gerektiğinde çalıştırmak, kamerayı her kare yerine saniyede birkaç kez örneklemek, bulut isteklerini toplu (batch) göndermek, ağır işi cihaz şarjdayken veya boştayken yapmak.

Dikkat: Sürekli çalışan bir YZ özelliği (canlı çeviri, sürekli nesne tanıma), pili çok hızlı tüketip cihazı ısıtabilir ve sistem tarafından kısıtlanabilir. Kullanıcıya bu maliyeti hissettiren bir özellik silinir. YZ'den her zaman "bu özelliği pil dostu nasıl yaparım?" sorusunu ayrıca sorun.

Optimizasyonun adımları

  1. Ölç. Profiler ile gerçek darboğazı bulun; tahmin etmeyin.
  2. En büyük sorunu seç. %1'lik iyileştirme peşinde koşmayın; en pahalı işlemi hedefleyin.
  3. YZ'ye veriyle sor. Profil çıktısı + ilgili kodla optimizasyon önerisi isteyin.
  4. Uygula ve yeniden ölç. İyileştirme gerçek mi? Sayı düştü mü?
  5. Regresyon kontrolü. Optimizasyon bir şeyi bozdu mu? Görsel ve işlevsel testi tekrarlayın.

Üç mini vaka

Vaka 1 — Yanlış yerde arama. Bir ekip, listelerin takıldığını düşünüp kaydırma kodunu haftalarca elden geçirdi, sonuç alamadı. Profiler alıp veriyi YZ'ye verdiklerinde gerçek darboğazın her satırda ağ üzerinden yeniden yüklenen görseller olduğu ortaya çıktı. Görsel önbelleği eklenince akıcılık 42 FPS'ten 60 FPS'e çıktı. Ders: ölçüm, haftalarca boş çabayı önler.

Vaka 2 — Pil canavarı özellik. Bir çeviri uygulaması, kamerayla canlı metin çeviri ekledi; kullanıcılar "telefon 15 dakikada ısınıp %30 pil gitti" diye şikayet etti. YZ'ye danışıldığında kameranın saniyede 30 kare işlendiği görüldü; bu 5 kareye düşürülüp sonuç birkaç kare arayla güncellenince pil tüketimi üçte bire indi, kalite fark edilmedi. Ders: YZ özelliğini her zaman pil gözüyle ayarlayın.

Vaka 3 — Başlangıç yavaşlığı. Bir uygulama 4,5 saniyede açılıyordu; kullanıcıların %20'si açılışta çıkıyordu. Profil, tüm başlangıç işlerinin (analitik, veri yükleme, model hazırlama) ana iş parçacığında sırayla yapıldığını gösterdi. YZ önerisiyle bunlar ertelendi ve arka plana alındı; açılış 1,3 saniyeye indi, terk oranı yarılandı. Ders: başlangıçta yalnızca zorunlu işi yapın.

Zayıf prompt / Güçlü prompt

Zayıf prompt:"Uygulamam yavaş, hızlandır."

Güçlü prompt:"Android uygulamamda liste kaydırma takılıyor (jank).Profiler verisi: her karede bindImageView 28ms sürüyor,görseller her seferinde ağdan yükleniyor, önbellek yok.İlgili kod: [RecyclerView adapter kodu].En etkili 3 optimizasyonu etki sırasına göre öner.Her biri için beklenen kazanç ve olası yan etkiyi belirt.Görsel kalitesini düşürmeyen çözümleri önceliklendir."

Kopyalanabilir şablonlar

Darboğaz analizi şablonu:"Şu profil verisini yorumla ve en pahalı 3 işlemi bul:[profiler çıktısı]. Her biri için olası sebep vesomut optimizasyon öner. Önce en yüksek etkiliyi ver."

Pil optimizasyonu şablonu:"Bu özellik pili hızlı tüketiyor: [özellik, örn. sürekli konum].Pil dostu hale getir:- Örnekleme sıklığını düşürme- Arka planda kısıtlama- Toplu işlem (batch)- Yalnızca gerekince çalıştırmaKullanıcı deneyimini bozmadan çözümleri sırala. [kod]"

Başlangıç hızlandırma şablonu:"Uygulama açılışını hızlandır. Şu anda başlangıçta yapılan işler:[liste]. Hangileri ertelenebilir, arka plana alınabilir veyatembel (lazy) yüklenebilir? Zorunlu olanları ayır. [kod]"

YZ özelliği maliyet şablonu:"Eklediğim [cihaz üzeri model / bulut çağrısı] özelliğininperformans ve pil maliyetini değerlendir. Ölçmem gerekenmetrikleri ve maliyeti düşürecek stratejileri listele. [kod]"

Sık yapılan hatalar

  • Ölçmeden optimize etmek. Gerçek darboğaz genelde tahmin edilenden farklı yerdedir.
  • Küçük kazanç peşinde koşmak. %1'lik iyileştirme yerine en pahalı işlemi hedefleyin.
  • YZ özelliklerinin pil maliyetini görmezden gelmek. Sürekli çalışan model/kamera/ağ pili yer.
  • Ana iş parçacığını yormak. Başlangıç ve kaydırmada ağır iş UI thread'de olmamalı.
  • Optimizasyon sonrası yeniden ölçmemek. İyileştirmenin gerçek olduğunu ve bir şeyi bozmadığını doğrulayın.
  • Emülatörde performans ölçmek. Gerçek cihaz hızı, ısısı ve pili tamamen farklıdır.

Özetle

Performans ve pil, mobil uygulamanın hayatta kalma meselesidir. Altın kural: önce ölç, sonra optimize et. Profil verisini YZ'ye vermek yorumu hızlandırır; ölçümsüz "hızlandır" isteği körlemesine tahmin ürettirir. En pahalı işlemi hedefleyin, küçük kazanç peşinde koşmayın. Bu modülde eklenen YZ yetenekleri güçlüdür ama pil ve işlemci maliyeti taşır; örnekleme sıklığını düşürerek, toplu işlem yaparak ve yalnızca gerekince çalıştırarak bu maliyeti yönetin. Her optimizasyondan sonra gerçek cihazda yeniden ölçün.

Uygulama görevi

Bir uygulamada (kendi projeniz veya örnek) profil alın ya da örnek bir profil çıktısı oluşturun ve "Darboğaz analizi şablonu" ile YZ'ye yorumlatın. En yüksek etkili optimizasyonu uygulayıp yeniden ölçün: sayı gerçekten düştü mü? Ayrıca bu modülde eklediğiniz bir YZ özelliğini (cihaz üzeri model veya bulut çağrısı) "YZ özelliği maliyet şablonu" ile pil açısından değerlendirin ve en az bir pil-dostu ayar belirleyin.

Kontrol listesi

  • [ ] Optimizasyondan önce profil aldım, tahmin etmedim
  • [ ] En pahalı işlemi hedefledim, küçük kazançlara dağılmadım
  • [ ] YZ'ye profil verisini somut sayılarla verdim
  • [ ] YZ özelliklerinin pil/işlemci maliyetini değerlendirdim
  • [ ] Ağır işi ana iş parçacığından çıkardım
  • [ ] Optimizasyon sonrası gerçek cihazda yeniden ölçtüm ve regresyonu kontrol ettim