.Net Core Reflection Optimize
Reflection denilince aklımıza gelen ilk şey “çok maliyetli” oluyor. Bazen Reflection iyi bir tercih olabiliyor. Örneğin private bir değişkeni değiştirmek ya da Runtime esnasında bir instance yaratıp property’lerini set etmek gibi ihtiyaçlarımız olabiliyor. Örnekler elbette çoğaltılabilir. Bu gibi ihtiyaçlarımız olduğunda gene aynı argümana sarılıp maliyet hesabı mı yapmalı? Peki bu maliyet (coast) bizim yazdığımız koddan kaynaklı olabilir mi?
İsterseniz birlikte daha optimize edilen bir reflection yazımı nasıl olabilir inceleyelim. Basit bir class yaratarak işe başlıyorum.
Oluşturmuş olduğum class içinde bir tane public, bir de private property var. Private property’e class’ımın dışından erişim sağlamam mümkün değil. Ancak burada Reflection yardımımıza koşuyor.
Alışılagelmiş şekilde Reflection ile private değişkenimize şöyle erişim sağlayabiliriz; önce instance örneği alıp, type üzerinden propertyInfo’ya erişilir sonrasında property adını yazarak public ya da private olmasından bağımsız olarak erişim sağlayabiliyoruz. Koda döktüğümüzde aşağıdaki gibi bir halde olmasını bekleriz:
Nasıl bir maliyet yaratmış olabilir Reflection bize? Buna benchmark testi ile bakalım:
Yukarıdaki görselden anlaşılacağı üzere basit bir instance alıp property’e erişim sağlamamızın katbekat fazlası ile karşılaşıyoruz.
Biraz optimize etmeye başlayalım, mesela PropertyInfo kısmını memory’den okusa durum nasıl değişir? Kodu aşağıdaki gibi düzenliyorum:
Eskisine nazaran bir iyileştirme söz konusu ama yeterince optimize olduğunu düşünemeyiz.
Nasıl bir iyileştirme yapabiliriz diye düşünürken yardımımıza Delegate koşuyor. Bir önceki optimize örneğinde memory’de property tutarak biraz iyileştirme yapmıştık. Şimdi bir delegate kullanarak kodumuzu aşağıdaki gibi düzenleyebiliriz:
Yukarıdaki metriklere bakınca sonucun oldukça başarılı olduğu kanaatindeyim.
Umarım faydalı bir makale olmuştur, proje koduna erişmek isterseniz: