JAVA-ANDROID Performance Part1

Kerim Fırat
4 min readApr 12, 2021

Kod geliştirirken kullandığımız programlama dili her durumda pozitif etki oluşturmaz. Dilin özellikleri birçok durumda negatif etki oluşturabilir. Ortaya çıkan negatif etkiler değişik şekilde kodumuzu/yazılımımızı etkisi altında bırakabilir ve/veya kararlılığını bozabilir. Negatif etkilere örnek verebileceğimiz çok sayıda örnek var ancak bu makale serisinde sadece “Performans” ele alınacaktır.

NOT:Bütün yazılarımda kavramları orjinal haliyle vermemin sebebi,okuyucuların kolaylıkla kavram üzerinde kapsamlı araştırma yapabilmelerini sağlamaktır.

Autoboxing Ve Unboxing

Bu anahtar kelimeleri sayısız kez görmüş ve duymuşuzdur. Ancak bana kalırsa çoğu kod geliştirici bu kavramları pek ciddiye almadığını düşünüyorum.
Öyle ki projelere kod katkısı yapan bazı deneyimli geliştiriciler dahi bu kavramları görmezden gelebiliyor veya hafife alıyor. Özellikle mobil programlama tarafında çok kez şahit olduğumu söyleyebilirim. Ve en önemlisi,özellikle mobil programlama tarafında alternatif kullanılabilecek yol ve yöntemler mevcut. Bunları sırayla inceleyeceğiz.

Yukarıdaki kavramları basit olarak açıklarsak:

  • Autoboxing” otomatik olarak kutulama.
  • Unboxing” kutudan çıkarma.

Bu kavramlar Java 1.5 ile java diline dahil oldu. Ve 1.5'ten bu yana,buna bağlı özellikler uygulamalarımızın performansını önemli ölçüde etkiliyor.
Bu kavramlar Java’da mevcut olan ilkel veri türlerini ve bunlara karşılık gelen nesne sarmalayıcı sınıfları arasında yaptığı otomatik dönüştürmedir. Java’da bulunan ilkel(Primitive type) türlere ve bunlara karşılık gelen sarmalayıcı(Wrapper class) sınıflara aşağıda yer verilmiştir.

image: docs.oracle.com

Autoboxing:
Eğer “int” türünü ele alırsak,bu kavram “int”’i “Integer”’a çevirmek için otomatik bir dönüştürme işlemi gerçekleştirir.Aşağıda bazı örnekler verilmiştir.
Örnek1:

Örnek1

Output:

Output:
44,44,44

Peki “Autoboxing” yaparak ne elde ettik?
Neden böyle bir şeye ihtiyacımız var?
El cevap: “a_primitive”’e özellik katmak ve dolayısıyla farklı yapılarda bu değeri kullanmak için autoboxing işlem yapılır.Çünkü sarmalayıcı(wrapper) class(sınıf) geliştiriciyi oldukça faydalı ve bol fonksiyonlarla destekler ve esnek bir kullanım sunar. Örneğin wrapper işlemiyle birlikte “int” bir değeri diğer veri tipleriyle(double,long,float,..) ele alıp kullanabiliriz.Buna bağlı olarak aşağıdaki görüntü açıklayıcı olacaktır.

Örnek2:

Autoboxing için bu iki örnek yeterlidir. Çünkü asıl konumuz “Performans”’dır. Ancak örnekleri sonlandırmadan önce aşağıdaki örneği inceleyelim.
Örnek3:

Bu örnek derleme zamanı hatası oluşturacaktır. Çünkü liste kullanımı sırasında toplu “Autoboxing”’e izin verilmiyor. Bunun çeşitli sebepleri var ancak asıl konumuza dönmek için üzerinde durmayacağım. Eğer primitive bir diziden wrapper diziye “Autoboxing” yapmak istiyorsak,bu işlemi Iterator kullanarak,yani elemanları tek tek ele alarak yapmamız gerekiyor.
Buna örnek olması açısından aşağıdaki örneğe yer verilmiştir:

Bütün örneklerde iki türlü wrapper yapabileceğimizi gördük. Bunlardan birisi “output_wrapper.add(i);”,
diğer örnek ise “output_wrapper.add(Integer.valueOf(i));” şeklindedir. İki örnek arasındaki tek fark birinin çalışma zamanında wrapper yapmasıdır.
Örneğin bu tanımlama:

output_wrapper.add(i);

Çalışma zamanında derleyici tarafından aşağıdaki hale dönüştürülür:

output_wrapper.add(Integer.valueOf(i));

Unboxing:
Autoboxing işleminde ilkel(primitive) bir veri tipini “Wrapper”’a çevirmiştik.
Bu işlemin tersi ise “Unboxing”’dir. Yani “Wrapper”’dan “primitive”’a dönüştürmektir.Eğer “Integer” türünü ele alırsak,bu kavram “Integer”’i “int”’a çevirmek için otomatik bir dönüştürme işlemi gerçekleştirir.
Örnek:

Performance(Performans):
Autoboxing ve Unboxing kavramlarını kısaca gördükten sonra asıl meselemiz olan performans konusuna geçelim. Kod geliştirirken,programlama dili ve diğer yardımcı araçlarla geliştiriciyi destekleyen önemli ve kullanışlı
araç-gereçlerin faydalarına karşılık,ayrıca bazı yan etkileri vardır veya yan etkiler oluşabilir.Bu özellikleri kullanırken aynı zamanda yan etkilere hazır olmak,yan etkileri göze almak ve alternatifleri göz önünde bulundurmamız gerekir. Dolayısıyla Autoboxing ve Unboxing kavramları bize esnek kullanımlar sunarken,aynı zamanda müthiş bir performans sorunuyla bizleri korkutuyor. Geliştirdiğimiz kod şayet bir sunucu tarafında çalışıyorsa bu durumda belki performans konusunu gözardı ederiz. Ancak bu kod sınırlı kaynaklı bir cihazda(örnek mobil telefon,iot cihaz vb.) çalışıyorsa
bu durumda performans konusunu gözardı edemeyiz.
Çünkü performansın olumsuz etkilenmesi,bu cihazlar için kritik olan batarya-enerji tüketimi demektir.

Aşağıda verilen örneklerde “Autoboxing” ve standart kullanım performans ölçümü gösterilmektedir.
Autoboxing Örnek:

Output:

Sonuçlar inanılmaz. Şimdi de Unboxing performans ölçümlerini görelim.
Unboxing Örnek:

Output:

Görüldüğü gibi performans sonuçları inanılmaz.
Java-Android Performance” başlıklı bir sonraki makalemde Autoboxing ve Unboxing kavramlarına alternatif olarak gelen “SparseArray”’ı kapsamlı olarak örnekleyecek ve “SparseArray.java” class’ın Andorid Source Code(AOSP) içindeki kaynak kodları üzerinden algoritmik yapısını inceliyeceğiz.

-end of

--

--

Kerim Fırat
Kerim Fırat

Written by Kerim Fırat

Senior Android Platform(AOSP,AAOS) Architect,Open Source Contributor | Turkey Java User Group Vice Chairman | Author

No responses yet