Memory<T> ve Span<T>: Heap Basıncını Azaltmanın Yolu

# Memory<T> ve Span<T>: Heap Basıncını Azaltmanın Yolu

C#'ta büyük veri dizileriyle çalışırken, her seferinde yeni array oluşturmak heap'e yüklenir ve garbage collector sık sık çalışır. Bu da uygulamayı yavaşlatır. `Memory<T>` ve `Span<T>`, heap tahsisini azaltarak bellek yönetimini optimize eder.

Span<T>: Stack'te yaşayan, sadece mevcut veriyi gösteren hafif bir yapı. GC'den bağımsız, hızlı erişim sağlar.

Memory<T>: Heap veya stack'te yaşayabilir, `Span<T>`'ye dönüştürülebilir, async işlemlerde kullanılabilir.

Eski Yöntem (Heap Basıncı Yüksek):

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1string text = "Hello World";
2string[] words = text.Split(' '); // Yeni array oluştu, heap'e yazıldı
3foreach (var word in words)
4{
5Console.WriteLine(word);
6}

Yeni Yöntem (Span<T> ile):

1string text = "Hello World";
2Span<char> buffer = stackalloc char[50]; // Stack'te yer ayır
3int index = 0;
4
5foreach (char c in text)
6{
7if (c == ' ')
8{
9Console.WriteLine(new string(buffer[..index]));
10index = 0;
11}
12else
13{
14buffer[index++] = c;
15}
16}
17if (index > 0)
18Console.WriteLine(new string(buffer[..index]));

Çıktı (Her iki yöntem):

1Hello
2World
1using System;
2using System.IO;
3
4byte[] fileBuffer = new byte[1024];
5using (FileStream fs = File.OpenRead("data.bin"))
6{
7Memory<byte> data = new Memory<byte>(fileBuffer);
8int bytesRead = fs.Read(data.Span);
9
10Console.WriteLine($"Okunan byte: {bytesRead}");
11}

1. Stackalloc: Küçük veriler için (< 1KB) `stackalloc` kullan.
2. Async İşlemler: `Memory<T>` kullan, `Span<T>` değil.
3. Parametre Geçişi: Fonksiyonlara `ReadOnlySpan<T>` geç, tahsis azalır.
4. Slice İşlemi: `buffer[2..5]` ile bellek kopyalamadan alt dizi al.

`Span<T>` ve `Memory<T>`, heap tahsisini minimize ederek GC basıncını azaltır. Yüksek performanslı uygulamalarda (game engine, veri işleme, real-time sistemler) bu araçlar gereklidir. Küçük veri işlemleri için `stackalloc`, büyük veya async işlemler için `Memory<T>` tercih et.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz