Makale Özeti

Programlama yaparken sık sık metinsel işlemler yapmak durumunda kalırız. Bir metni başka bir metinle birleştiririz... Büyükçe bir metnin içerisinden bir bölümünü alırız... İki metni birbiriyle karşılaştırırız... Bu liste böylece uzar gider...

Makale

Metin(String) İşlemlerinde Performansı Artırmak

Programlama yaparken sık sık metinsel işlemler yapmak durumunda kalırız. Bir metni başka bir metinle birleştiririz... Büyükçe bir metnin içerisinden bir bölümünü alırız... İki metni birbiriyle karşılaştırırız... Bu liste böylece uzar gider...

Metinsel işlemler denilince akla gelen ilk şey metin birleştirme işlemidir. “Bir metnin bir diğerine eklenmesi.” İş metinle ilgili olduğunda bu işi gerçekleştirmek için Vb.Net te ilk akla gelen veri tipi “string” dir. “System.String” sınıfını (class) temsil eden string, bir referans türüdür. Ancak biraz farklı bir referans türüdür. Yapı olarak “immutable”, yani değişmezdir/sabittir ve bu yüzden bir kez yapılandırıldıktan sonra içeriği değiştirilemez. İşte bu yapıdan dolayıdır ki bir string değişkene ancak bir kez değer atayabilirsiniz.

Peki ya aşağıdaki kod?

    Dim metin As String = "Merhaba"
    metin = metin + " Dünya!"
metin="Merhaba Dünya!"

String bir referans türü olduğu için bellekteki öbek (heap) bölgesinde yaratılır ve içeriğine “Merhaba” yüklenir. Öbekteki bu nesneye kodun erişebilmesi için gerekli adres bilgisi ise belleğin yığın (stack) bölgesinde yaratılan “metin” değişkenine yazılır. Yani referans türlerde değişken nesneyi değil, nesnenin adresini tutar.

Şimdi ikinci satıra bakalım. Birinci satırda, metin değişkeninin temsil ettiği string nesnesine “birinci string nesnesi” diyelim. İkinci satırdaki kod işlendiğinde “birinci string nesnesi” üzerine yeni değer ekelenemeyeceğinden, öbekte ikinci bir string nesnesi türetiliyor ve işlem sonucu, yani “Merhaba Dünya!” bu ikinci string nesnesine yükleniyor.

Ve kilit nokta!

“metin” değişkeni ikinci satırdaki kodun sonunda artık “birinci string nesnesi”nin değil, “ikinci string nesnesi”nin adresini taşımaya başlıyor. Yani artık “birinci string nesnesi” tamamen erişilemez oluyor ve “Çöp Toplayıcı” (Garbage Collector) devreye girip belleği temizleyene kadar bellekte yer tutmaya devam ediyor.

İşte “string” veri tipinin bu yapısı nedeniyle metinsel işlemlerde daha iyi performans sağlamak amacıyla System.Text isim alanı içine bulunan “StringBuilder” sınıfı kullanılmaktadır.

Algoritmaya bağlı olarak değişmekle birlikte, StringBuilder sınıfının çok çok daha hızlı olduğu söylenebilir.

Aşağıdaki örnek kod ve yukarıdaki ekran görüntüsü, metin birleştirme işlemlerinde gerçekten çok iyi performans gösteren StringBuilder sınıfının, string ile karşılaştırıldığı bir Console (konsol) uygulamasıdır.

Hoşçakalın.
Kadir ÇAMOĞLU


Sub Main()
Degisken tanimlari

Dim str As String = ""
Dim sb As New System.Text.StringBuilder
Dim baslangic As DateTime
islemin baslangiç ani
Dim bitis As DateTime
islemin bitis ani
Dim sure As TimeSpan
islemin toplam süresi

string veri tipiyle metin birlestirme islemi.....
Console.WriteLine("string veri tipi kullanilarak metin birlestirme.....")
baslangic = DateTime.Now islemin baslangiç zamani
Console.WriteLine("Baslangiç :" + vbTab + baslangic.ToString())

For i As Integer = 0 To 10000
    str += i.ToString()
Next

bitis = DateTime.Now islemin bitis zamani
Console.WriteLine("Bitis :" + vbTab + vbTab + bitis.ToString())
sure = bitis.Subtract(baslangic) geçen süre hesaplaniyor..
Console.WriteLine("Toplam süre :" + vbTab + sure.TotalMilliseconds.ToString + " milisaniye")

-------------------------------------------------------
Console.WriteLine()

StringBuilder sinifiyla metin birlestirme islemi.....
Console.WriteLine("StringBuilder sinifi kullanilarak metin birlestirme.....")
baslangic = DateTime.Now islemin baslangiç zamani
Console.WriteLine("Baslangiç :" + vbTab + baslangic.ToString())

For i As Integer = 0 To 10000
    sb.Append(i.ToString())
Next

Dim metin As String = bitis.ToString()
bitis = DateTime.Now islemin bitis zamani
Console.WriteLine("Bitis :" + vbTab + vbTab + metin)
sure = bitis.Subtract(baslangic) geçen süre hesaplaniyor..
Console.WriteLine("Toplam süre :" + vbTab + sure.TotalMilliseconds.ToString + " milisaniye")

-------------------------------------------------------
Console.WriteLine()
Console.WriteLine("Uygulamaya sonlandirmak içim [Enter] tusuna basin.")
Console.ReadLine()

End Sub