C#’ta Performans Optimizasyonu : Bölüm 1 — String Birleştirme Yöntemleri

Gökberk Timurözü
Kariyer.net Tech
3 min readJul 1, 2024

--

Merhabalar,

C#’ta Performans Optimizasyonu serimizin ilk bölümünde en basit konulardan biri olan string birleştirme işlemlerine değineceğiz.

Bildiğiniz gibi C#’ta string tipindeki nesneleri birleştirmek için çeşitli yöntemler kullanabiliyoruz.

Bu yazımızda sık kullanılan iki yöntemin nasıl kullanıldığına bakacak ve bu iki yöntemin döngü içindeki performanslarını karşılaştıracağız.

1. Yöntem — String Concatenation (+ operatörü ile string birleştirme)

public void StringConcatenation()
{
string str1 = "Hello ";
string str2 = "World";
string result = str1 + str2;
}

Yukarıdaki örnekte olduğu gibi string tipindeki nesneleri “+” operatörü ile arka arkaya gelecek şekilde birleştirebiliriz.

2. Yöntem — StringBuilder Sınıfı

public void StringBuilder()
{
string str1 = "Hello ";
string str2 = "World";

var sb = new StringBuilder();
sb.Append(str1);
sb.Append(str2);

string result = sb.ToString();
}

Yukarıdaki örnekte olduğu gibi StringBuilder nesnesinden instance aldıktan sonra, tanımladığımız değişkenleri “.Append()” methodu aracılığıyla birleştirebiliriz.

Performans Karşılaştırması — String Concatenation vs StringBuilder

Süreleri ölçmek için BenchmarkDotNet kütüphanesinden faydalanacağız ve her iki yöntemide 10.000 iterasyon üzerinden değerlendireceğiz.

İki yöntemin performanslarını karşılaştırmak için kodları aşağıdaki gibi düzenleyeceğiz.

  • String Concatenation
[Benchmark]
public void StringConcatenation()
{
const int iterations = 10000;

string str1 = "Hello World";
string result = string.Empty;

for (int i = 0; i < iterations; i++)
{
result = result + str1;
}
}
  • StringBuilder Sınıfı
[Benchmark]
public void StringBuilder()
{
const int iterations = 10000;

string str1 = "Hello World ";
string result = string.Empty;

var sb = new StringBuilder();

for (int i = 0; i < iterations; i++)
{
sb.Append(str1);
}

result = sb.ToString();
}

Uygulamayı çalıştırdıktan sonra göreceğimiz çıktı;

Analiz

Her iki yöntemin arasındaki süre ve allocated memory farkını analiz etmeden önce bilmemiz gereken önemli bir nokta var; C# dilinde “string” nesneleri immutable’dır, yani bir kez oluşturulduktan sonra içerikleri değiştirilemez. Bir string üzerinde değişiklik yapmak istediğimizde aslında yeni bir string nesnesi oluşturulur ve bu yeni nesne için yeni bir bellek alanı tahsis edilir.

Döngü içinde string concatenation yöntemi ile birleştirme yaptığımızda her bir döngüde yeni bir nesne oluşturulur, bu da bellek, işlemci ve garbage collector üzerinde ekstra yük oluşturur.

StringBuilder” sınıfı ise bizlere mutable bir string yapısı sağlar.

Yani “StringBuilder” sınıfından instance alındığında, döngü içinde içerik değiştirilerek aynı nesne üzerinde işlem yapmamız sağlanır. Bu da hem bellek hemde işlemci üzerindeki yükü azaltır. Dolayısıyla kaynakları daha verimli ve optimize şekilde kullanmış oluruz.

Sonuç

Özellikle büyük miktarda veya döngü içinde string birleştirme işlemi yaparken “+” operatörü ile birleştirme yapmaktan kaçınıp StringBuilder sınıfına yönelmemiz, performans ve bellek allocation konularında bize fayda sağlayacaktır.

Ancak az sayıda stringi birleştirdiğimiz noktalarda, + operatörü ile birleştirmek veya string interpolation yöntemini kullanmak okunabilirlik açısından daha faydalı olabilir. Elimizdeki string nesnelerine ve yapacağımız birleştirme işlemlerinin sayısına göre benzer Benchmark’lar yaparak hangi yöntemi seçeceğimize karar verebiliriz.

Anahtar Kelimeler

String Concatenation

String Interpolation

StringBuilder Sınıfı

Garbage Collector

Immutable ve Mutable Kavramları

Memory Allocation / Memory Management

Kaynakça

--

--