Java ME String ve StringBuffer optimizasyonu

____________________________________________________________________

String ve StringBuffer s覺n覺flar覺 Java’da metinler 羹zerinde 癟al覺覺rken en 癟ok kullan覺lan s覺n覺flard覺r. Dolay覺s覺yla da cep telefonlar覺 gibi ilemci g羹c羹n羹n d羹羹k olduu ayg覺tlarda bu s覺n覺flar ile ilgili ilemlerin olabildiince h覺zl覺 olmas覺 iyidir. Bu ama癟la bu s覺n覺flar覺 kullan覺rken birka癟 ilem ile az da olsa optimizasyon yapabiliriz.

String nesneleri sabit bir nesnedir ve bir kez yarat覺ld覺ktan sonra deitirilemez, StringBuffer nesneleri ise deitirilebilirler. Bu iki s覺n覺f kullan覺l覺rken performans a癟覺s覺ndan uygun olan覺n覺 kullanmaya 繹zen g繹stermeli.

String yaratma

String nesneleri aa覺daki gibi iki farkl覺 ekilde yarat覺labilir.

  1. String string1 = “Merhaba.”;String string2 = “Merhaba.”;
  2. String string3 = new String(“Merhaba.”);String string4 = new (“Merhaba.”);

Peki cep telefonumuz i癟in bir program yazarken bunlardan hangisini kullanmal覺? 襤kisini de kullanabiliriz tabi ama ayg覺t覺m覺z覺n cep telefonu olduunu d羹羹nerek ilkini kullanmam覺z daha mant覺kl覺. 羹nk羹 string1 ve string2 ayn覺 nesnenin referans覺d覺r, string2 羹retilirken string1’in nesnesine sadece bir referans 羹retilmi olur. string3 ve string4 ise new kelimesi ile yeni nesneler 羹retir ki bu da daha zor ve zaman alan bir ilemdir.

String nesnelerini birletirme

Bazen String nesnelerimizi birletirerek farkl覺 nesnelerdeki yaz覺lar覺 tek bir nesnede birletirerek kullanmam覺z gerekir. Bu durumda bunu yapabileceimiz y繹ntemler olarak ilk akl覺m覺za +, String.concat(string) ve StringBuffer.append(string) gelir. Peki bunlardan hangisi daha h覺zl覺d覺r?

Genelde StringBuffer.append() y繹ntemi + y繹ntemine g繹re daha h覺zl覺 olarak d羹羹n羹l羹r ama bu her zaman doru olmayabilir. Burada 繹nemli olan ey nesnenin deerlerinin derleme 繹ncesinde bilinip bilinmemesidir.

Mesela birletirilecek deerlerimiz “Merhaba,”, “ben”, “F-“, “Blog” olsun.

+ ile birletirme kodu 繹yle yaz覺l覺r:
String yazi = “Merhaba,” + ” ben” + ” F-” + “Blog”;

StringBuffer i癟in ise 繹yle bir kod yazar覺z;
StringBuffer yazi = new StringBuffer();
yazi.append(“Merhaba,”);
yazi.append(” ben”);
yazi.append(” F-“);
yazi.append(” ME”);
En sonunda da yazi.toString() kullanarak bir ilem yapmam覺z gerekir.

al覺ma esnas覺nda yukar覺daki iki y繹ntemin 癟覺kt覺s覺 da ayn覺 olacakt覺r. 襤kisinin yazaca覺 ey de bu olacakt覺r; “Merhaba, ben F-Blog”.

Ancak yukar覺daki kodu derleme 繹ncesinde yazd覺覺m覺zdan bu ilemde + kullanmak StringBuffer kullanmaktan daha h覺zl覺 sonu癟 getirecektir! Bu nas覺l olabilir diyebilirsiniz, iin s覺rr覺 ilkinde nesnelerin derleme aamas覺nda birletirilmesi ve 癟al覺t覺rma esnas覺nda nesneye dokunulmamas覺, ikincisinde ise birletirmenin 癟al覺t覺rma esnas覺nda yap覺lmas覺. Yani derleyici ilk y繹ntemde derleme esnas覺nda birletirmeyi yapacakt覺r. Yani yazd覺覺n覺z kodun derleme sonucu 繹yle olacakt覺r;
String yazi = “Merhaba, ben F-Blog”;
襤kinci y繹ntem ise derleme an覺nda dokunulmayacak ve 癟al覺t覺rma an覺nda birletirilecek ve bu da 癟al覺t覺rma an覺nda daha fazla zaman alacakt覺r.

Bunu nerede kullanabiliriz, ne ie yarar? Normalde derleyicinin derleme esnas覺nda anlayabilecei birletirmeleri yapmaya gerek yok gibi g繹r羹n羹r ama bir projede 癟ok uzun yaz覺lar yazman覺z gerekiyorsa bunlar覺 aa覺daki ekilde yapmak kodlar覺 yazarken sizin rahatl覺覺n覺za olacakt覺r;

String yazi = “sat覺r1” +
“sat覺r2” +
“sat覺r3”;

Bu acemi kod yazarlar覺 (ben de dahil) taraf覺ndan s覺k abart覺lan bir nokta. + iaretini kullanmaktan ka癟覺n覺yoruz ama iin i癟ine girince zaten derleyicinin bu ilemi kendi yapt覺覺n覺 g繹r羹yoruz.

Eer kod 癟al覺t覺rma esnas覺nda birletirilecek ise StringBuffer.append() ile birletirmek daha iyidir. 羹nk羹 + y繹ntemi birletirme esnas覺nda hem String hem de StringBuffer nesneleri yarat覺r ve kullan覺r. Bunun sebebi + y繹nteminin deitirilemez String nesnelerini deitirmesidir, bu deitirme i癟in 繹nce String nesnelerinden StringBuffer nesneleri 羹retir, sonra bunlar覺 append() ile birletirir ve bunlar覺 String yap覺p size geri d繹ner. Hatta birletirilecek nesnelerin uzunluunu da biliyorsan覺z, StringBuffer nesnesini de bu uzunluu uygun olarak oluturursunuz ve keyfinize diyecek yoktur. Bununla ilgili de aa覺y覺 okuyun.

StringBuffer oluturmada optimizasyon

StringBuffer nesneleri StringBuffer isim = new (StringBuffer) eklinde yarat覺l覺rlar. Bu ekilde nesne StringBuffer nesneleri i癟in standart olan 16 karakter uzunluunda yarat覺l覺r. Bu nesneye daha sonradan nesne eklenirken bu uzunluk a覺ld覺k癟a nesnenin uzunluu iki kat覺n覺n iki fazlas覺na 癟覺kar覺l覺r. Yani 16 karakter uzunluu a覺l覺rsa 2*16+2 eklinde bir hesapla uzunluk artt覺r覺l覺r ve 34 yap覺l覺r. Bu da tekrar a覺l覺rsa 2*34+2 ilemiyle uzunluk 70 olur, tekrar artt覺r覺l覺rsa da 2*70+2 eklinde bellek yettiince ilem yap覺l覺r durur.

Bu ekilde uzunluk artt覺rma esnas覺nda Java sanal makinesi belirtilen uzunlukta bir karakter dizesi yarat覺r, eski nesneden veriyi bu dizeye kopyalar ve yeni eklenecek karakterleri al覺p buraya kopyalar ve ekleme yap覺lm覺 olur. Tabi bu da olduk癟a fazla ilemci zaman覺 kullan覺r.

Bu y繹ntemin hilesi de StringBuffer nesnesini 繹nceden ihtiyac覺m覺z olduu kadar uzun yaratmakt覺r. Bunun i癟in de yapaca覺m覺z ey nesneyi yarat覺rken uzunluunu belirtmektir;

StringBuffer yazi = new StringBuffer(int uzunluk);

Bu ekilde yeterli uzunlukta bir nesnemiz varsa bir veri eklendiinde zaten haz覺r olan karakter dizesi i癟indeki yerine yaz覺l覺r, yeni bir dize oluturulmas覺 vs. gerekmez, bu da bize daha h覺zl覺 bir uygulama salar.

Bunlar olduk癟a basit y繹ntemler ama Java ME de zaten basit cihazlar i癟in. M羹mk羹n olsa Sun Microsystems uramaz s羹r羹m羹n羹 koyard覺 telefona. Yani o bile bunu bilerek telefonlar i癟in farkl覺 bir s羹r羹m 癟覺kard覺 ise bizim de Java ME programlar覺m覺zda String ve StringBuffer kullan覺m覺na dikkat etmemiz gerekli.