Makale Özeti

Çoğumuzun dikkat etmediği ama büyük uygulamalarda performans kaybına yol açabilecek klasik string birleştirmenin yerine daha hızlı olan String builder'ı anlatacağım bu makalede

Makale

Bugün bence çok zevkli ve bir o kadar da önemli olan Stringbuilder sınıfını anlatacağım..(yazması uzun olduğu için makale sonuna kadar sb diyeceğim)
Peki nedir bu sb? (sb stringe koca bir kaşıkla dalmak demek)
.netin bizim hizmetimize sunduğu system.text isimuzayı içinde yer alan faydalı bir sınıf. Bu sınıfla eskiden aa=aa&bb şeklinde yaptığımız varolan stringin sonuna ekleme yapmamız çok kolaylaşıyor ve aynı zamanda hızlı (!)(Makalenin sonundaki resimlerden ne demek istediğimi siz de anlayacaksınız)

sb'nin alt yordamları, fonksiyonları

.append(strek) stringimizin sonuna ekleme yapar
.appendline(strek) stringin sonuna ekleme yapar ve alt satıra geçer(vbcrlf gibi)
.appendformat(strek) belirli formatta verdiğimiz yazının belirlediğimiz yerlerini doldurmaya yarar. Eğer daha önce C ile çalıştıysanız printf("Çarşıdan aldım %d tane eve gittim %d tane","1","1000) kodunun yaptığı işe benzetebiliriz... sb.appendformat("Çarşıdan aldım {0} tane eve gittim {1} tane","1","1000") şeklinde kullanılır.. Çıktısı Çarşıdan aldım 1 tane eve geldim 1000 tane şeklinde olacaktır
.capacity Bu property ile sb mizin alabileceği maximum karakter sayısını belirleyebiliriz
chars(i) Bu fonksiyon ile sb mizin istediğimiz pozisyonundaki karakterini alabiliriz.

 

.copyto(kaynakkrktr,hedef,hedefkrktr,karaktersayisi) Sbmizin belirlediğimiz bir karakterinden başlayarak belirli bir sayıda karakteri alıp, hedef char'ın istediğimiz karakterine ekleme yapar
.equal(sb2) Bir sb nin diğerine eşit olup olmadığını kontrol eder eşitse true döndürür
.insert(ibaslama,strdeger,isayi) İstediğimiz karakter pozisyonuna istediğimiz veriyi istediğimiz sayıda yazmamıza yardımcı olur
.lenght sbmizin toplam karakter sayısını verir

 

.maxcapacity sbmizin alabileceği maximum karakter sayısını verir
.remove(ibaslama,iuzunluk) İstediğimiz karakterden istediğimiz uzunluk kadar yeri silmemizi sağlar
.replace(stresk,stryeni)  sb içindeki tüm eski değerleri yenileriyle değiştirmemizi sağlar... vb deki replace işlemiyle aynı denebilir
.tosting sb içindeki veriyi string oalrak döker

Şimdi gelelim hız testimizin sonuçlarına :)

Bu test 5 defa yapıldı ve her bir string sonuçta 50000 karaktere ulaştı... (Birleştirme işlemi her seferinde birer harf eklenerek yapıldı)
Bu testte ve diğer testte string buildersız birleştirmeyi nce çalıştırarak torpil geçtiğimiz bile söylenebilir. (sbsiz birleştirme hafızayı doldurur, bilgisayrı yorar ama yine de sbli birleştirme sbsiz birleştirmeye fark atmış durumda) Aradaki fark ortada. Biri 8,6 saniye diğeri 0,01 saniye

Bu test 3 defa yapıldı ve yine sbsiz birleştirmeye torpil geçildi... Ama gördüğünüz gibi karakter sayısı ne kadar uzarsa fark o kadar açılıyor...

Bu farkın nedeni nedir peki?

String buildersız birleştirmede bunlar yapılır
1. Sonucu tutucak boyutta geçici hafıza alanı oluşturulur.
2. Değişken geçici alanın başına kopyalanır.
3. Eklenicek veri gerçici alanın sonuna kopyalanır.
4. Değişkenin eski alanı boşaltılır.
5. Değişkene son halini tutabilecek boyutta bir alan oluşturulur.
6. Geçici alandaki veriler, değişkenin son alanına kopyalanır.
(Can Hanhan'ın finarfin.net teki bir yazısından alıntı, yazıyı okumak için http://blog.aspindir.com/oku.asp?ID=135 adresini ziyaret edebilirsiniz)

MSDN'den alıntı:

The String object is immutable. Every time you use one of the methods in the System.String class, you create a new string object in memory, which requires a new allocation of space for that new object. In situations where you need to perform repeated modifications to a string, the overhead associated with creating a new String object can be costly. The System.Text.StringBuilder class can be used when you want to modify a string without creating a new object. For example, using the StringBuilder class can boost performance when concatenating many strings together in a loop.

String nesnesi sabittir. System.string methodlarından birini her kullanışınızda, hafızada yeni bir alana ihtiyaç duyan string nesnesi oluşturursunuz. String'imizde tekrarlama ihtiyazı duyduğumuz değiştirme işlemlerinde, her seferinde yeni bir string nesnesi yaratmak zaman alabilir. System.text.Stringbuilder sunufı, stringi yeni bir nesne yaratmaksızın değiştirmek istediğinizde kullanılabilir.Örneğin StringBuilder sınıfı döngü içinde string birleştirme hızınızı arttırabilir.
(Devamı için: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconusingstringbuilderclass.asp)

 

Bundan sonra sbsiz string birleştirmek mi asla dediğinizi duyar gibiyim...
Hepinize bol .net'li günler dilerim

Tuna Toksöz

Makalede kullanılan kodlar