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.
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…
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.
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.
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
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!
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