üye ol Üye Girişi Söyle Sözünü Anasayfa Yukari Çik
Bilgi Paylaştıkça Büyür

C# da 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 C# ta 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?

string metin=”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.

‘string’ veri tipi kullanilarak metin birlestirme…..

Baslangiç : 24.11.2003 20:31:06

Bitis : 24.11.2003 20:31:08

Toplam süre : 2193,1536 milisaniye

‘StringBuilder’ sinifi kullanilarak metin birlestirme…..

Baslangiç : 24.11.2003 20:31:08

Bitis : 24.11.2003 20:31:08

Toplam süre : 20,0288 milisaniye

Uygulamaya sonlandirmak içim [Enter] tusuna basin.

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 uygulamasıdır.

static void Main(string[] args)
{

// Degisken tanimlari

string str=”";

System.Text.StringBuilder sb=new System.Text.StringBuilder();

DateTime start; // islemin baslangiç ani

DateTime end; // islemin bitis ani

TimeSpan sure; // islemin toplam süresi

// string veri tipiyle metin birlestirme islemi…..

Console.WriteLine(“‘string’ veri tipi kullanilarak metin birlestirme…..”);

start=DateTime.Now; // islemin baslangiç zamani

Console.WriteLine(“Baslangiç :\t” + start.ToString());

// Metin birlestirme islemi…..

for(int i=0;i<10000;i++)

{

str +=i.ToString();

}

end=DateTime.Now; // islemin bitis zamani

Console.WriteLine(“Bitis :\t\t” + end.ToString());

sure=end.Subtract(start); // geçen süre hesaplaniyor..

Console.WriteLine(“Toplam süre :\t” + sure.TotalMilliseconds + ” milisaniye”);

//——————————————————-

Console.WriteLine();

// StringBuilder sinifiyla metin birlestirme islemi…..

Console.WriteLine(“‘StringBuilder’ sinifi kullanilarak metin birlestirme…..”);

start=DateTime.Now; // islemin baslangiç zamani

Console.WriteLine(“Baslangiç :\t” + start.ToString());

// Metin birlestirme islemi…..

for(int i=0;i<10000;i++)

{

sb.Append(i.ToString());

}

end=DateTime.Now; // islemin bitis zamani

Console.WriteLine(“Bitis :\t\t” + end.ToString());

sure=end.Subtract(start);// geçen süre hesaplaniyor..

Console.WriteLine(“Toplam süre :\t” + sure.TotalMilliseconds + ” milisaniye”);

//——————————————————-

Console.WriteLine();

Console.WriteLine(“Uygulamaya sonlandirmak içim [Enter] tusuna basin.”);

Console.ReadLine();
}

hürrem dağkıran

Yazar Hakkında

Hakkında: editor
Kimlik kartı

Bir Cevap Yaz

kendi isteğimle kurallara uygun yazıyorum. (Lütfen yandaki kutuyu işaretleyin.)

Otomatik robotlara karşı soru.