|
Metin(String) İşlemlerinde Performansı Artırmak |
|
Gönderiliyor lütfen bekleyin... |
|
|
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();
}
|
Kadir ÇAMOĞLU
Makale:
Metin(String) İşlemlerinde Performansı Artırmak C#, Visual C# ve .NET Kadir Çamoğlu
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|