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ş: Reflection
2var property = typeof(Person).GetProperty("Name");
3var value = property.GetValue(person);
4
5// Hızlı: Doğrudan erişim
6var value = person.Name;

Optimizasyon: Caching

Aynı tipe tekrar tekrar erişiyorsanız sonuçları saklayın:

1private static readonly Dictionary<Type, PropertyInfo[]> PropertyCache = new();
2
3public 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.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

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();
5
6// Ş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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz