Reflection Performansı: Reflection'dan Kaçmak ya da Optimize Etmek
.NET'te Reflection, türlerin özelliklerini çalışma zamanında okumanızı sağlar. Ancak her çağrıda sistem metaveri taraması yaptığı için maliyetlidir. Özellikle döngü içinde kullanıldığında performans ciddi şekilde düşer.
Reflection'un neden yavaş olduğunu anlamak önemlidir. Tip bilgilerini runtime'da sorgulamak, derleyicinin yapamadığı işleri çalışma zamanında yapmak demektir. Bu, CPU cache'ini boşaltır ve bellek erişimini artırır.
Kaçınma Yöntemi: Doğrudan Referans
En hızlı yol Reflection'u hiç kullanmamaktır. Türleri önceden biliyorsanız:
1// Yavaş: Reflection2var property = typeof(Person).GetProperty("Name");3var value = property.GetValue(person);45// Hızlı: Doğrudan erişim6var value = person.Name;Optimizasyon: Caching
Aynı tipe tekrar tekrar erişiyorsanız sonuçları saklayın:
1private static readonly Dictionary<Type, PropertyInfo[]> PropertyCache = new();23public PropertyInfo[] GetProperties(Type type)4{5if (!PropertyCache.TryGetValue(type, out var props))6{7props = type.GetProperties();8PropertyCache[type] = props;9}10return props;11}Bu yaklaşım ilk çağrıda Reflection yapar, sonraki çağrılar cache'den döner. Bin kere çağrıda 100 kat hızlıdır.
Expression Trees ile Dinamik Kod Üretimi
Caching'ten daha ileri gitmek istiyorsanız, Reflection sonuçlarını derlenmiş koda çevirin:
1var parameter = Expression.Parameter(typeof(Person));2var property = Expression.Property(parameter, "Name");3var lambda = Expression.Lambda<Func<Person, string>>(property, parameter);4var compiled = lambda.Compile();56// Şimdi compiled() çağrısı normal metot kadar hızlı7var name = compiled(person);İlk derleme biraz zaman alır, sonra saf hız elde edersiniz.
Pratik Tavsiye
Reflection'a ihtiyacınız varsa: önce cache edin, sonra Expression Trees düşünün. Döngü içinde Reflection yapmayın. Dependency injection ya da factory pattern kullanarak Reflection'u başlangıçta bir kere yapın, sonra cache'den çekin.
Performans kritikse profiler ile ölçün. Çoğu zaman Reflection sorunu yoktur; başka bir yerde darboğaz vardır.
0 yorum