Bir uygulamanın ne kadar iyi olduğunu kullanıcılar çoğu zaman özellik listesinden değil, hızından anlar. Açılırken takılan, kaydırırken titreyen ya da telefonun pilini hızla bitiren bir uygulama, ne kadar zengin olursa olsun kısa sürede silinir. İyi haber şu: performans sorunlarının büyük çoğunluğu sihirli bir çözümle değil, küçük ve tutarlı iyileştirmelerle aşılır. Bu yazıda hem yeni geliştiriciye hem de mevcut uygulamasını hızlandırmak isteyene yönelik, gerçekten işe yarayan ipuçlarını topladım.

Önce ölçün, sonra optimize edin

Performans iyileştirmesinde en sık yapılan hata, tahminle hareket etmektir. Hangi ekranın yavaş olduğunu hissedebilirsiniz ama nedenini ancak ölçerek görürsünüz. Bir şey hızlı görünmüyor diye saatlerce yanlış yeri optimize etmek çok yaygındır.

Çoğu geliştirme ortamı yerleşik profilleme araçları sunar. Bunlarla şu üç şeyi izleyin:

  • CPU kullanımı: Hangi fonksiyon ekranın donmasına yol açıyor?
  • Bellek: Zamanla artan ve geri düşmeyen bir kullanım var mı? Bu genelde sızıntı işaretidir.
  • Ağ: Kaç istek atılıyor, ne kadar veri iniyor, hangi istek bekletiyor?

Pratik bir yaklaşım: bir özelliği optimize etmeden önce mevcut süresini not edin, değişikliği yapın, tekrar ölçün. Böylece gerçekten ilerleme kaydedip kaydetmediğinizi bilirsiniz. Diyelim ki bir liste ekranı ilk açılışta 800 milisaniyede geliyor; hedefinizi 300 milisaniye gibi somut bir sayıya bağlarsanız, ne zaman duracağınızı da bilirsiniz.

Açılış süresini kısaltın

Kullanıcının uygulamayla ilk teması açılış ekranıdır ve ilk izlenim burada oluşur. Soğuk açılış dakikalar değil milisaniyeler meselesidir; birkaç yüz milisaniyelik gecikme bile fark edilir.

Başlangıçta sadece gerekeni yükleyin

Uygulama açılırken her şeyi hazırlamaya çalışmak en büyük yavaşlatıcı nedenlerden biridir. İlk ekranda görünmeyen modülleri, ağır kütüphaneleri ve veri tabanı işlemlerini ertelemek çoğu zaman tek başına belirgin bir hızlanma sağlar.

  1. Açılışta hangi işlerin yapıldığını listeleyin.
  2. Her birinin ilk ekran için gerçekten gerekli olup olmadığını sorgulayın.
  3. Gerekli olmayanları ekran göründükten sonraya, hatta kullanıcı o özelliğe dokunduğu ana erteleyin.
  4. Büyük başlatma işlerini arka plana taşıyın ki ana iş parçacığı serbest kalsın.

Kullanıcıya hemen bir iskelet arayüz (içerik gelene kadar gösterilen gri kutucuklar) sunmak da algılanan hızı ciddi şekilde artırır. Veri henüz gelmemiş olsa bile ekranın canlı durması bekleme hissini azaltır.

Arayüzü akıcı tutun

Akıcı bir arayüz, saniyede 60 kare hedefiyle çalışır. Bu da her karenin yaklaşık 16 milisaniye içinde hazırlanması gerektiği anlamına gelir. Bu süreyi aşan her iş, gözle görülür takılmaya yol açar.

  • Ana iş parçacığını meşgul etmeyin: Resim işleme, dosya okuma, JSON çözümleme gibi ağır işleri arka plana alın. Arayüz çizimi dışındaki her şey mümkün olduğunca başka bir parçacıkta olmalı.
  • Uzun listeleri geri dönüştürün: Binlerce öğeyi bir anda oluşturmak yerine yalnızca ekranda görünenleri çizip kaydırma sırasında yeniden kullanın. Modern liste bileşenleri bunu zaten destekler.
  • Gereksiz yeniden çizimleri azaltın: Değişmeyen bir bileşen tekrar tekrar çizilmemeli. Durum yönetimini, yalnızca ilgili parça değiştiğinde güncelleme yapacak şekilde tasarlayın.
  • Gövde hiyerarşisini sadeleştirin: Çok iç içe geçmiş arayüz katmanları hesaplama maliyetini artırır. Daha düz bir yapı hem okunabilir hem hızlı olur.

Görselleri ve medyayı optimize edin

Görseller çoğu uygulamada hem belleğin hem ağ trafiğinin en büyük tüketicisidir. Burada yapılacak iyileştirmeler genelde en hızlı geri dönen iyileştirmelerdir.

  • Görseli ekranda görüneceğinden daha büyük yüklemeyin. 200 piksel genişliğindeki bir alana 2000 piksellik bir görsel yüklemek belleği boş yere doldurur.
  • Modern ve sıkıştırılmış görsel formatlarını tercih edin; aynı kaliteyi daha küçük boyutta verirler.
  • Bir kez indirilen görseli önbellekte tutun ki her açılışta tekrar inmesin.
  • Listelerde görselleri tembel yükleyin: yalnızca ekrana yaklaşanları indirin.
Küçük bir kural: kullanıcıya gösterdiğiniz her görsel, gösterileceği boyuta göre hazırlanmış olmalı. Geri kalan her şey israftır.

Ağ isteklerini akıllı yönetin

Mobil cihazlar her zaman hızlı ve kararlı bağlantıda olmaz. Metroda, asansörde ya da zayıf sinyalde çalışan bir uygulama yazmak, performans tasarımının ayrılmaz parçasıdır.

Daha az ve daha küçük istek

Her ağ isteğinin bir kurulum maliyeti vardır. On adet küçük istek atmak yerine, mümkünse veriyi tek seferde almak genelde daha hızlıdır. Sunucudan da yalnızca ekranda kullanacağınız alanları isteyin; tüm veriyi çekip yarısını atmak hem bant genişliği hem pil israfıdır.

Önbellek ve çevrimdışı davranış

  • Sık değişmeyen verileri yerelde saklayın; uygulama açılır açılmaz eldeki veriyi gösterin, güncellemeyi arka planda yapın.
  • İstek başarısız olursa kullanıcıya boş ekran değil, anlamlı bir mesaj ve tekrar deneme seçeneği sunun.
  • Aynı veriyi kısa aralıklarla tekrar tekrar istemekten kaçının; gereksiz çağrılar hem yavaşlatır hem veri tüketir.

Finansal verilerle çalışan uygulamalarda bu özellikle önemli. Örneğin bir birikim ya da bütçe takibi uygulamasında, kullanıcı uygulamayı her açtığında güncel bakiyenin hemen görünmesi beklenir; bunu sağlamanın yolu, son bilinen veriyi anında gösterip senkronizasyonu sessizce arkada yürütmektir.

Bellek ve pil tüketimini düşük tutun

Hızlı ama telefonu ısıtan, pili eriten bir uygulama da kullanıcının gözünden düşer. Bellek sızıntıları ise zamanla uygulamayı yavaşlatır ve sonunda çökmesine yol açar.

  • Dinleyicileri ve abonelikleri temizleyin: Ekran kapandığında başlattığınız olay dinleyicileri, zamanlayıcılar ve abonelikler de durdurulmalı. Unutulan dinleyiciler en yaygın sızıntı kaynağıdır.
  • Arka plan işlerini sınırlayın: Konum, sensör ve sürekli senkronizasyon gibi işler pili hızla tüketir. Bunları yalnızca gerektiğinde açın ve işi bitince kapatın.
  • Toplu işlem yapın: Ağ ve disk işlemlerini tek tek değil gruplar halinde yapmak cihazın uyku durumundan daha az çıkmasını sağlar, bu da pile yarar.
  • Büyük nesneleri serbest bırakın: Artık ihtiyaç duyulmayan büyük veri yapılarını ve görselleri elde tutmayın.

Sürekli takip edin

Performans bir kez yapılıp bitirilen bir iş değil, sürekli bakım isteyen bir konudur. Her yeni özellik, eklenen her kütüphane uygulamayı biraz daha ağırlaştırabilir. Bu yüzden gerçek cihazlarda, özellikle de eski ve düşük donanımlı telefonlarda düzenli test yapmak önemlidir; geliştiricinin elindeki güçlü cihaz çoğu kullanıcıyı temsil etmez.

  • Uygulama boyutunu takip edin; gereksiz büyüyen paket hem indirmeyi hem açılışı yavaşlatır.
  • Sürüm öncesi temel performans ölçümlerini tekrar yapın ve önceki sürümle karşılaştırın.
  • Mümkünse gerçek kullanıcılardan çökme ve yavaşlama verisi toplayın ki sorunları sahada görmeden çözebilesiniz.

Özet

Mobil performans, tek bir büyük numaraya değil bir dizi küçük ve disiplinli karara dayanır. Önce ölçün, açılış yükünü hafifletin, ana iş parçacığını serbest tutun, görselleri ve ağ isteklerini akıllı yönetin, bellek ile pili gözetin ve tüm bunları sürekli takip edin. Bu adımları alışkanlık haline getirdiğinizde, kullanıcılar belki neyin değiştiğini tam olarak söyleyemez ama uygulamanın sadece iyi hissettirdiğini fark eder; ki performans iyileştirmesinin gerçek amacı da budur.