top of page
  • GitHub-Mark-Light-120px-plus
  • LinkedIn Social Icon
  • Twitter Social Icon

Span<T> İncelemesi

  • Writer: hacer_bakirci
    hacer_bakirci
  • Apr 27, 2021
  • 2 min read

Updated: Oct 11, 2024


ree

Span C# 7.2 ile birlikte yeni bir value type (struct) olarak karşımıza çıkıyor ve bellekten tasarruf noktasında başvurabileceğimiz bir yöntem sağlıyor.


.Net Core ile kullanabileceğimiz bu yapıyı biraz irdeleyelim.


Span'in value type olması dolayısıyla muhatabımız, belleğin stack bölgesi.


Burada yüzeysel bir back to basics yapacak olursak (ayrıdan daha ayrıntılı bir back to basics konseptli yazı olabilir); bellekten serbest bırakma işini Garbage Collector'e bıraktığımız kod "Managed" kod oluyor. Bir de GB 'ın kontrol etmediği "Unmanaged" kod tarafı var. Unmanaged kod bellek yönetiminin bizim tarafımızdan yapıldığı koddur.

Belleğin stack bölgesinde yer ayırma veya serbest bırakma (allocation-deallocation) olayları çok daha hızlıdır. Hatta bu şekilde Garbage Collector'un yükünü de azaltmış oluruz.


Normalde bir array oluşturduğumuzda belleğin heap bölgesinde yer ayrılır (managed). Bu array'i stack bölgesinde tutmak istediğimizde unmanaged kod'a başvurmamız yani "stackalloc" keyword'ünü kullanmamız gerekiyor.


Span'in bizlere sağladığı yapı ise, stack veya heap bölgelerinde oluşturduğumuz array üzerinden, bellekte ekstra bir yer ayırmadan, unmanaged kod yazmadan istediğimiz bir bölümünü refere edip o bölümde işlem yapabilmektir.


Span ile hem heap hem de stack bölgesine erişebildiğimiz için farklı metotlar yazmadan, memory de yeni bir allocation'a gerek kalmadan array üzerinden işlem yapabiliyoruz. Bu da performans anlamında önemli bir kazanç sağlıyor.

Span'i aslında belleğin belirli bir görüntüsü olarak kabul edebiliriz. Bir array'in istediğimiz kadar alanını görebiliriz.


Örneğin elimizde şöyle bir array olsun;

ree

Bu array üzerinden bir span oluşturmak için yapmamız gereken :

ree


Artık oluşturduğumuz span üzerinden memory'deki değerlere ulaşmamız ve hatta değerleri direkt değiştirmemiz mümkün ;

ree

Ayrıca array üzerinden sadece istediğimiz kadarı ile de Span oluşturabiliyoruz;

ree
ree

Eğer elimizde array'in referansı değil de zaten o array üzerinden yaratılan bir span varsa bu span üzerindeki "Slice" metodunu kullanarak başka bir span oluşturabiliriz.

ree
ree






Span <T>, dizilerin performansını sürdürürken belleğe type-safe erişim sağlar.


Çok kullanışlıdır çünkü belleğin bir kısmını bölüp, immutable tiplerdeki gibi mevcut veriyi tekrar kopyalayıp bellekte yeni bir allocation yapmadan yönetebiliyoruz.


Dezavantaj diyebileceğimiz durumlar da, Span'ın struct olması ve IEnumerable'dan katılım almıyor olması. Bu sebepten IEnumerable'ın sağladığı esnekleklikleri (Linq) Span üzerinde kullanamayacağız. Kendisinin de fazla metodu bulunmamaktadır.




Recent Posts

See All
"Multiple Enumeration" Sorunsalı

Çözümü çok basit fakat, özellikle büyük ölçekli projelerde ve veritabanından döndürdüğümüz epeyce yüklü bir data kümesi söz konusu...

 
 
 

Comments


SIGN UP AND STAY UPDATED!

Thanks for submitting!

  • GitHub-Mark-Light-120px-plus
  • LinkedIn
  • Twitter

© 2020 - Talking Software - A  passionate computer & software engineer.

bottom of page