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):
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ır3int index = 0;45foreach (char c in text)6{7if (c == ' ')8{9Console.WriteLine(new string(buffer[..index]));10index = 0;11}12else13{14buffer[index++] = c;15}16}17if (index > 0)18Console.WriteLine(new string(buffer[..index]));Çıktı (Her iki yöntem):
1Hello2World1using System;2using System.IO;34byte[] 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);910Console.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.
0 yorum