C# Boxing ve Unboxing Nedir

Merhabalar, Boxing ve Unboxing hakkında en önemli unsur hiç şüphe yok ki performanstır.
Uygulamalarımızda çok sık olarak farkında olmadan veya farkında olaraktan boxing ve unboxing işlemlerinin yer aldığı kod parçalarını kullanıyoruz.

Boxing , bir değer türünün referans türüne atanması sırasında gerçekleşen işleme verilen isimdir.

Not : Net Framework’te value type ve referance type olmak üzere iki tür veri tipi vardır. Değer tipleri (Value type) stack (Yığın)’da Referans tipleri (Reference type) ise Heap (Öbek)’de tutulmaktadır. Referans tipleri : Dynamic, Delegate, Interface, Strings, Object, Class. Value tipleri ise ; int , float , double,char vb. tiplerdir.

Değer türleri:  "int", "long", "float", "double", "decimal", "char", "bool", "byte", "short", "struct", "enum"

Referans türleri:  "string", "object", "class", "interface", "array", "delegate", "pointer"



unBoxing ise bunu tam tersi olmakta ve referans türünün değer türüne dönüştürülmesini kapsamaktadır.
Hangisi olursa olsun, değer türlerinin tutulduğu stack bellek bölgesi ile, referans türlerinin tutulduğu heap bellek bölgesi arasında yer değiştirme ve kopyalama işlemleri söz konusudur.

NOT : İster boxing ister unboxing işlemi söz konusu olsun, bellek üzerinde stack ve heap bölgeleri arasında yeniden adresleme ve kopyalama işlemi söz konusudur.

İşte bu adresleme ve kopylama işlemlerinin uygulama içerisinde sayısız defa tekrar ediyor olması performansı olumsuz yönde etkileyen en önemli nedenlerden birisidir. Bunu daha iyi anlamadan önce, boxing ve unboxing işlemlerini biraz daha alt seviyede incelemek gerekir. Çok basit olarak aşağıdaki console uygulamasının MSIL (Microsoft Intermediate Language) koduna bir göz atalım.






Basit b
ir örnek ile boxing uygulandığı ve uygulanmadığı durumlarda süresel farkları tespit ederek performans değerlendirmesi yapabilmek.


Her iki region altındaki kodlarda aynı işi yapar. 10000 kez i değeri üzerinden alan hesabı yaparak, sonuçları ekrana yazar. Ancak her iki teknik arasında özellikle de WriteLine metodları içerisinde az ToString() kullanımı farkı vardır. İlk region içerisindeki kodlarımızda ToString metodunu kullanmadık. Bu sebeplede, değerler ekrana yazdırılmadan önce boxing işlemi söz konusu olacaktır. Ancak ikinci region bölgesindeki kodlarımızda yer alan WriteLine metodunda ise değer türlerimiz için ToString metodunu kullanıyoruz. Sonuçta süre farkı önemsenecek derecede yüksektir. İkinci teknik daha hızlı sonuç almamızı sağlamıştır. Her ne kadar yukarıdaki gibi bir örneği pek kullanmayacak olsanızda, geniş çaplı uygulamalar düşünüldüğünde gereksiz yere yapılan boxing ve unboxing işlemleri, uygulamanın genelinde önemli oranda performans ve hız kaybına neden olabilir.










Hiç yorum yok:

Yorum Gönder