Sekiz Android Performans Önerisi

Kod yazarken dikkat edilecek hususlar

Yavuz Çalışır
Teknolojik Girişimler

--

Kabul edelim ki Android yavaş bir işletim sistemi (pre-KitKat!). Bu da demektir ki developerlara fark yaratabileceği bir alan var ortada. Kodlamasını bilen daha değerli. Böylelikle önce Java sonra Android kodu yazabilmenin önemini kavramış bulunuyoruz.

Aslında burada yazdıklarımla bitmez, incık boncuk çok şey var ama sık atlanılanları şöyle kategorize edeyim:

A. Gerek duymadığını kodlama

B. Gereksiz nesnelerle belleği ağlatma.

Performans için konuşmadan önce en büyük belalarımızdan biri olan “multi-device” yine karşımıza çıkıyor. Piyasada bir çok cihaz var. Bir çok donanım, bir çok VM (Virtual Machine, “dalvik” diye de duymuş olabilirsiniz). VM’in her ayrı versiyonu, işlemleri farklı hızlarda çalıştırıyor. Böylelikle bir cihazdaki sonuç ile diğer cihazdaki sonuç aynı olmuyor. Bir de emülatör diye bir şey var. Aslında o, az buçuk sonuçların ne olacağını söylüyor gibi ama onunla da iş yapılmaz diye düşünsemde, bir çok cihazda test etmek mali maliyet olduğu için elimizdeki en iyi seçenek bu aslında. Birde JIT(Just In Time Compiler)’i olan cihazlarla olmayan cihazlar arasında büyük bir fark var. Yine JIT’li cihaz için en uygun kod JIT’siz için en kod değildir. Stabil bir şey yok yani.

1. Gereksiz Objectleri Tanımlamaktan Kaçın.

Yeni bir object tanımlamak çok da kolay bir şey değildir. Yani her new String(); bizden çok şey götürür. Garbage collector ile belleği temizlemek aslında güzel bir yöntem ancak, neden “yeni object tanımla— temizle” yapasanız ki?

Çok fazla object üretmek garbage collector’ün daha fazla çağırılmasını tetikler. Bu ise kullanıcı arayüzünde takılmalara sebep olur.

Çok fazla object üretme demekle kalmayıp bir kaç örnekle devam ediyorum.

Örnek: String return eden bir fonksiyonun var ve bu string sürekli başka bir string’in sonuna ekleniyorsa, bunu append() kullanarak yap. Geçici değişken tanımlayıp, eşitleme. Ayrıca unutma ki

String ‘in sonuna bir şeyler eklemek için kötü bir yol.

kullanmak yerine;

kullanmak daha akıllıcadır.

Örnek: String içerisinden bir kısım alacaksanız yeni bir string oluşturmak yerine substring() kullanın.

Örnek: int ve Integer arasındaki farkı öğrenin ve her zaman int kullanın.

Örnek: “İki boyutlu bir dizi” yerine” bir boyutlu iki dizi” kullanmak daha avantajlıdır. Eğer api tasarlıyorsanız bunu görmezden gelin. Api tasarımında başka bir koda rahatça erişmek daha önemlidir.

2. Değişkenlerde Static Final Kullan.

Bir class’ın en başında değişkenlerin şöyle tanımlandığını varsayalım:

Class ilk kullanıldığında, derleyici class initializer’ı çağırır (<clinit>). Ardından intVal 42'ye strVal ise “Hello world!”e setlenir.

Bir de şuna bakalım:

<clinit> çağırılmasına gerek yoktur. intVal ve strVal artık .dex dosyasında bulunuyor.

3. Class içerisinde kendi Get/Setlerini Kullanma.

Native dillerde x = mCount yerine m = getCount() kullanmamaya alıştık. Bu altyapı ile C# ve Java’da bu alışkanlığımıza devam ediyoruz. Gayet doğal buraya kadar. Çünkü derleyici genellikle satır içinden erişir ve falan falan..

Android için bunu yapmayın. Virtual Method’ların çağırılması maliyetlidir. Methodların arasında aramasındansa satırdan gitsin erişsin. Ancak bu demek olmuyor ki public void setName(); ‘i silip her classtan direk erişelim. Bu da “Nesneye Yönelik”e ters.

4. Döngülerini Adam Et.

Üç döngü arasında karşılaştırma yapalım

bir() en yavaşıdır. Çünkü JIT döngünün her turunda dizinin uzunluğuna optimize olmamış bir şekilde bakıyor.

iki() biraz daha iyi’dir. Her değişken local tanımlanmış. Ama her seferinde dizinin uzunluğuna erişmek zorunda kalıyor yine.

uc() JIT’si olmayan cihazlar için en hızlısı. Ancak JIT’si olan cihazda iki()’yi çalıştırmaktan farksız.

5. Virgüllü Sayılar?

float, int’den iki kat yavaştır!

float ile double arasında fark yok. double’da iki kat daha fazla veri saklayabiliyorsunuz. Bu yüzden double önerilendir.

6. Kütüphaneyi Bil.

Bazı methodlar vardır ki, ellinle yazdığın kodlardan daha iyi performans sunar. Tipik örneklerinden String.indexOf(); ile dalvik gerçekten harikalar yaratır. Benzer bir şekilde System.arraycopy(); elinle yazdığın bir koddan 9 kat daha hızlıdır. Bu tür methodları kullanmaya çalışma en iyisi ;)

7.Native Yazmak Daha İyidir.

Android NDK’i indirip uygulamaları C++’da geliştirebilirsiniz. Ve bu Java’ya göre daha iyi hız sağlayabilir. Ancak yeni başlayan biri için Java’yı öneririm, kafa karıştırmayın hiç. (Çok klasik ve boş bir öneridir bu, olmasa olmaz :) )

8. Ölçüm Yap.

Kodu optimize etmeye başlamadan önce, ölç. Gerçekten bir problemin var mı?

Micro-benchmark tester olarak Caliper’i kullanabilirsin.

Ayrıca Traceview vardır ki tadından yenmez.

İncelemeden geçmeyin: traceview kullanımı ve systrace.

--

--