String Birleştirme Ve Performans

Uygulamalırımızda en çok kullandığımız değişken tiplerinden bir tanesi de string’dir. Bir çok işlemimizi string’ler üzerinde yaparız. Ancak strinf değişkenleri kullanırken dikkat etmemiz gereken ve bize performans açısından büyük katkı sağlayacak bir kaç nokta vardır.

Hepimiz uygulamalarımızda

 string x = “”;
        for (int i=0; i <= 100000; i++)
        {
            x += i.toString();
        }

tarzında bir string birleştirme işlemi gerçekleştirmişizdir. Bu tarz bir string birleştirme işlemi küçük döngülerde bir problem oluşturmazken büyük döngülerde başımıza ciddi performans problemleri çıkarabilir. Bunun nedeni ise böyle bir birleştirme işleminde bütün atama işlemlerinde yeni bir nesne oluşturulmasıdır. Yani döngümüzün ilk tekrarında x değerini alır, yeni bir string değişken oluşturur. Eski değeri yeni değişkene atar ve sonrasında verdiğimiz string değeri buna ekler. Bir sonraki adımda yine yeni bir nesne oluşturulur, bu kez ikinci nesnedeki değer üçüncüye atılır ve adımlar bu şekilde devam eder. Yani yukarıdaki gibi bir döngü yazmış iseniz, sadece string birleştirme işlemi için 100000 ekstra nesne oluşturulur. Buna uygulamanıza esktra yük demektir.

Bu soruna çözüm ise StringBuilder. Yukarıdaki kodu aşağıdaki şekilde de yazabiliriz.

        StringBuilder builder = new StringBuilder();
        for (int i=0; i < 100000; i++)
        {
            builder.Append(i.toString());
        }
       string x = builder.ToString();

Kodumuzu bu hale getirdiğimizde bu kod parçası için yaklaşık 10 kat hız artışı sağlamaktadır.

Peki heryerde string oluşturma işlemlerimizi bu şekilde mi yapmalıyız. Tabii ki hayır. Örneğin

string tamad=ad+” “+soyad;

kod parçası yerine

 StringBuilder builder = new StringBuilder();
 builder.Append (ad);
 builder.Append (” “);
 builder.Append (soyad);
 string tamad= builder.ToString();

kod parçasını kullanmak bize bir performans artışı sağlamayacağı gibi okunurluğu da azaltacaktır.

6 Yorum

Aykut ArasMayıs 11th, 2010 08:41

Merhaba,

Bir kaç bölümlü string birleştirmeler için String.Concat veya String.Format kullanmak daha avantajlıdır hem yazımları daha kolay hem de okunabilirlikleri daha fazla.

String.Format(”{0} {1}”,ad,soyad);
String.Concat(ad, ” “, soyad);

Ben genelde okunabilirlik açısından String.Format’ı tercih ediyorum ama String.Concat’ın daha performanslı olduğunu biliyorum ama String.Format’ın sadece string değil tüm object türündeki nesneleri alması ayrı bir avantaj diye düşünüyorum.

Kendine çok iyi bak,
iyi çalışmalar…

Mehmet KORDACIMayıs 12th, 2010 11:58

Aykut sanırım sonda bulunan string tamad=ad+” “+soyad; kısmı için bu eklemeyi yapma gereği duydun. Evet aslında onun için Concat yada Format fonksiyonlarını kullanmak daha mantıklı. Ben çok fazla bir performans farkı yaratmayacağı için o şekilde belirtmiştim ama madem yapıyoruz optimum şekilde yapmak en doğrusu. Kesinlikle haklısın. Teşekürler katkın için.

Aykut ArasMayıs 12th, 2010 12:39

Performans açısından farkettiğini biliyorum ama bu farkın çok önemli olduğunu ben de düşünmüyorum. Dediğim gibi genelde String.Format özelliğini kullanıyorum bunun sayesinde kurduğum stringleri ileride okuması daha kolay oluyor ayrıca decimal, double gibi tipleri string’e aktarırken formatlamada da oldukça kolaylık sağlıyor.

foocalaDeseMayıs 27th, 2010 08:06

Just want to say what a great blog you got here!
I’ve been around for quite a lot of time, but finally decided to show my appreciation of your work!

Thumbs up, and keep it going!

Cheers
Christian, iwspo.net

foocalaDeseHaziran 1st, 2010 14:44

Just want to say what a great blog you got here!
I’ve been around for quite a lot of time, but finally decided to show my appreciation of your work!

Thumbs up, and keep it going!

Cheers
Christian,Diet Guide!

foocalaDeseHaziran 9th, 2010 11:29

Just want to say what a great blog you got here!
I’ve been around for quite a lot of time, but finally decided to show my appreciation of your work!

Thumbs up, and keep it going!

Cheers
Christian,Earn Free Vouchers / Cash

Yorum Yapın

Mesajınız