Boxing vs Unboxing
Kutulamak ve kutuyu kaldırmak. İşte bütün mesele bu. 😇
Value type ve referance type olaraka ikiye ayırdığımız veri tipleri bazen stack
bazen ise heap
üzerinde tutulmaktadır. Value tipler stack
üzerinde saklanırken referans tipler heap
üzerinde saklanmaktadır ancak stack
üzerinde de bir başvuru bulundurduğunu unutmamak gerekiyor.
Temel kısa bir özet yaptıktan sonra artık bu iki kavramı daha iyi anlayabiliriz.
Boxing
value tipinde olan bir değişkeni referans tipinde bir nesneye aktarma işlemini tanımlar.
Unboxing
işlemi ise tam tersi bir işlem yürütür. Yani referans tipindeki bir nesnenin işaret ettiği değeri bir value tipine aktarma işlemini tanımlar.
Boxing
ve Unboxing
işlemlerinde odak noktamız bellekte verilerin tutulma şeklidir. Bu işlemler gerçekleştirilirken bellekte tutulan nesnelerin tutulma yöntemi de değiştiği için maliyetli bir olay olduğu söylenir.
Bu yazıda bu söylentinin doğru olup olmadığını ve performans karşılaştırmalarını yapmaya çalışacağım.
C# üzerinde günlük hayatta kullandığımız pre-defined
olan yapılarda da boxing
ve unboxing
operasyonlarının olduğunu söyleyebiliriz.
IList<T>
ve List<T>
yapıları bu örnek için oldukça uygundur.
List<T>
kullandığımızda herhangi bir boxing
uygulanmadan bir Enumerator<T>
elde etmiş oluruz. Ancak IList<T>
kullandığımızda IEnumerator<T>
tipinde boxing
uygulanmış bir değişken elde etmiş oluruz.
BenchmarkDotnet
kütüphanesinin yardımıyla bir test gerçekleştirdiğimizde sonuçlar aşağıdaki gibi olacaktır.
Başka bir örnek vermek gerekirse LINQ
yapısı ele alınabilir. LINQ
query yapısı IEnumerable<T>
üzerinde çalışır bu sebeple bir value tipini LINQ
üzerinde işletmek yine Boxing
işlemini sebep olacaktır.
Boxing
ve Unboxing
işlemleri maliyetlidir. Teknik dökümanlara göre Boxing
işlemi normal bir atama işleminden 40 kat fazla maliyet oluşturabilir. Yine Unboxing
işlemleri de 4 kat fazla maliyet oluşturabilir.
Özellikle LINQ
sorgularında daha performanslı olmak için code base üzerinde bu tarz değişiklikler yapılabilir. Ancak performans testlerinde de ortaya çıkan sonuçlar doğrultusunda gözle görülebilen bir performans artışı olmayacaktır. Çünkü bahsettiğimiz bu birimler oldukça küçük birimlerdir.
Önemli olan Boxing
ve Unboxing
işlemleri gerçekleştiğinde verilerin tutulma şeklinin nasıl değiştiğini anlayabilmek. Ayrıca verilerin tutulma şekli değişirken gerçekleşen işlemlerin maliyeti nasıl etkilediğini tahmin edebilmektir.
Yazdığınız kodlar production ortamında hatasız çalışsın. Testler sizi korusun. 🙏
.NET Performance Tips — .NET Framework | Microsoft Docs
Boxing and Unboxing — C# Programming Guide | Microsoft Docs
Difference between Boxing and Unboxing in C# (tutorialspoint.com)
Difference between Boxing and Unboxing in C# — GeeksforGeeks