Bazen yazdığınız bir kaç satır karakter katarını "+" operatörü ile birleştirmek isteyebilirsiniz. Peki javada bu işlem nasıl yapılıyor? Neler yaparsak daha hızlı bir kod yazarız?
class KatarBirlestirme {
public static void main(String args[]) {
System.out.println("merhaba" + " " + "dunya");
}
}
jad ile yazdığımız ve derlediğimiz kodları geri dönüştürürsek analiz edebiliriz. String nesnesi Immutable (değiştirilemez) olduğundan karakter katarı birleşimlerini java StrinBuffer nesnesi dönüştürerek yapar. Ama derleyici hızı açısından burada JVM'in hepsini tek katar olarak düşünmesi beklenir. (Yani ben olsaydım böyle yapardım.) İşte JAD ile geri dönüştürdüğümüz kod:
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3)
// Source File Name: KatarBirlestirme.java
import java.io.PrintStream;
class KatarBirlestirme
{
KatarBirlestirme()
{
}
public static void main(String args[])
{
System.out.println("merhaba dunya");
}
}
Tadaaa .. 10 puan, 10 puan, 10 puan, 10 puan ... JVM'e 10 puan zeki bir yaratık optimizasyonu böyle yapar. Peki olayı biraz çetrefilli hale getirip değişken de ekleyelim.
class DegiskenliKatarBirlestirme {
public static void main(String args[]) {
String degisken = " dunya";
System.out.println("merhaba" + degisken);
}
}
Ve sonuç ...
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3)
// Source File Name: DegiskenliKatarBirlestirme.java
import java.io.PrintStream;
class DegiskenliKatarBirlestirme
{
DegiskenliKatarBirlestirme()
{
}
public static void main(String args[])
{
String s = " dunya";
System.out.println((new StringBuilder()).append("merhaba").append(s).toString());
}
}
Burada aklımıza şu soru geliyor. Tüm bunları incelemem için beni gaza getiren Sun dökümanında şu ifade geçiyor: Use StringBuffer to Concatenate Strings Karakter katarlarını birleştirmek için StringBuffer kullanın. Derleyici benim yerime bu işlemi yapıyorsa ben neden bununla vakit geçireyim. Tamam derleme süresini 10 ms uzatabilir ama sonuçta derlendikten sonra benim kodum ve derlenen kod aynı işlemi yapmış olacak. Üşenmedim bir de aynı işlemi ben yapayım dedim, Ve ByteCode düzeyinde olayı irdeleyelim. Bir Önceki sınıfın [[http://www.cs.princeton.edu/~benjasik/dis/|dis]] ile disassembly edilmiş hali:
super synchronized class DegiskenliKatarBirlestirme extends java/lang/Object
Method <init> () -> void
0 aload_0
1 invokenonvirtual #1 <Method java/lang/Object.<init> ()V>
4 return
Method public static main (java/lang/String []) -> void
0 ldc #2 <String " dunya">
2 astore_1
3 getstatic #3 <Field java/lang/System.out Ljava/io/PrintStream;>
6 new #4 <Class java/lang/StringBuilder>
9 dup
10 invokenonvirtual #5 <Method java/lang/StringBuilder.<init> ()V>
13 ldc #6 <String "merhaba">
15 invokevirtual #7 <Method java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;>
18 aload_1
19 invokevirtual #7 <Method java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;>
22 invokevirtual #8 <Method java/lang/StringBuilder.toString ()Ljava/lang/String;>
25 invokevirtual #9 <Method java/io/PrintStream.println (Ljava/lang/String;)V>
28 return
Kodumuzu StringBuffer kullanarak yazarsak
class TamponluKatarBirlestirme {
public static void main(String args[]) {
String degisken = " dunya";
System.out.println((new StringBuffer("merhaba")).append(degisken).toString());
}
}
java assembly hali
super synchronized class TamponluKatarBirlestirme extends java/lang/Object
Method <init> () -> void
0 aload_0
1 invokenonvirtual #1 <Method java/lang/Object.<init> ()V>
4 return
Method public static main (java/lang/String []) -> void
0 ldc #2 <String " dunya">
2 astore_1
3 getstatic #3 <Field java/lang/System.out Ljava/io/PrintStream;>
6 new #4 <Class java/lang/StringBuffer>
9 dup
10 ldc #5 <String "merhaba">
12 invokenonvirtual #6 <Method java/lang/StringBuffer.<init> (Ljava/lang/String;)V>
15 aload_1
16 invokevirtual #7 <Method java/lang/StringBuffer.append (Ljava/lang/String;)Ljava/lang/StringBuffer;>
19 invokevirtual #8 <Method java/lang/StringBuffer.toString ()Ljava/lang/String;>
22 invokevirtual #9 <Method java/io/PrintStream.println (Ljava/lang/String;)V>
25 return
Burada benim yazdığım kod daha yavaştır çünkü aynı işlemi StringBuffer sınıfı ile yapmaktayım. Fakat J2SE 1.5 ile gelen StringBuilder sınıfı JVM 1.5 tarafından otomatik kullanılmış. Eee buradan çıkaracağımız ders. Aynı şekilde kod yazmaya devam edin. Burda yazılanları bilmeseniz de olurdu. :)
|