pengeunpedi pengeunpedi pengeunpedi
  penguenyuvasi   pengulog   arşiv   bulut   rss

dizge birleştirmenin anatomisi

Tuesday, June 27, 2006 2:09:00 AM tarihinde Fırat KÜÇÜK tarafından gönderildi.

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. :)

atölye, inceleme, javakaynak | yorumlar [0]
 
ilişkili gönderiler:

delicious | digg | reddit | magnoliacom | furl | google | yahoo






pengulog

her hakkı erkektir © 2008 e-posta