Skip to main content

C# 4.0 Dynamic Type – Reflection Hız Testi

C# 4.0 ile gelen Dynamic type’ların ilk bakışta sadece .NET ortamı dışında yazılmış bir tipi, .NET ortamında kullanmak amacıyla getirildiğini düşünebilirsiniz. Ancak Dynamic tipleri, halihazırda Reflection tiplerini kullanarak kod geliştirdiğimiz durumlarda Reflection tipleri yerine kullandığımızda ciddi performans kazançları elde edebiliyoruz. Dolayısıyla C# 4.0 ile geliştirilen uygulamalarda reflection tipleri yerine dynamic tipleri kullanmak oldukça mantıklı hale geliyor.

Aşağıdaki örnekte IMedia arayüzünü(interface) uygulayan Music ve Video adında iki sınıfımız(class) var. Hazırladığım basit bir konsol uygulamasında birer tane Music ve Video nesnesi oluşturarak bu nesnelerin Play işlemlerini gerçekleştirecek generic PlayMedia<T> metodunu çağırıyorum. Senaryo icabı reflection veya dynamic type kullanmayı zorunlu kılmak için, PlayMedia metoduna Play metodu içeren herhangi bir nesnenin gelebileceği şekilde tasarladım. PlayMedia metodunun 20 ve 21 numaralı satırlarında dynamic tip kullanılarak metoda gönderilen ve tipi derleme zamanında belirli olmayan media nesnesinin Play metodu çağrılmış. Eğer Reflection tiplerinin kullanılmasını test etmek isterseniz 20 ve 21 numaralı satırları yorum satırı haline getirip, 19 numaralı satırın yorumlarını kaldırabilirsiniz. İlk olarak sadece 19 numaralı satırı çalıştırarak test sonuçlarını alıyorum. Sonrasında 20 ve 21 numaralı satırları çalıştırarak test sonuçlarını aldığımda aradaki fark gerçekten oldukça cezbedici :)

Reflection bir tipin yapısını çözümleyerek içerisindeki metot, field gibi üyelere erişmeye çalışmaktadır. Ancak dynamic tip içerdiği tipi çözümlemeden, doğrudan istenilen üyeye erişeceği için sonuca daha hızlı ulaşabilecektir. Zaten aşağıdaki gibi bir test çalışması yapacak olursanız sonucun bu doğrultuda çıkacağını göreceksiniz.

Örnekte kullandığımız tiplerin sınıf diyagramı aşağıdaki gibidir.

    1 class Program

    2 {

    3     static void Main(string[] args)

    4     {

    5         Music m = new Music { FileName = "amazing.mp3" };

    6         Video v = new Video { FileName = "avatar_fragman.wmv" };

    7 

    8         PlayMedia<Music>(m);

    9         PlayMedia<Video>(v);

   10         Console.ReadLine();

   11     }

   12 

   13     static void PlayMedia<T>(T media)

   14     {

   15         DateTime d1, d2;

   16         d1 = DateTime.Now;

   17         for (int i = 0; i < 1000000; i++)

   18         {

   19             //media.GetType().GetMethod("Play").Invoke(media, null);

   20             dynamic d = media;

   21             d.Play();

   22         }

   23 

   24         d2 = DateTime.Now;

   25         TimeSpan t = d2 – d1;

   26 

   27         Console.WriteLine(t.TotalSeconds);

   28     }

   29 }

Test sonuçlarından da görüleceği gibi, reflection kullanılarak 1.000.000 kayıt üzerinde yapılan işlem ortalama 1.85 saniye sürerken, dynamic tip kullandığımda ortalama 0.17 saniye gibi bir süre alıyor. Yani dynamic tip kullanıldığında 10 kat hız sağlanmış görünüyor. Tabi ki farklı senaryolarda daha farklı sonuçlar elde edilebilir, ama dynamic tipin reflectiona göre açık şekilde daha hızlı çalıştığını söybu tarz işlemlerde performans adına daha iyi bir seçim olacağı ortada.

C# 4.0 Dynamic Type – Reflection Hız Testi” hakkında 4 yorum

  1. Yok factory patternindeki durum daha farklı. Orada aynı interface’i implemente eden objelerden hangisinin create edileceğine karar veren sade bir karar mekanizması var.

    Örneğimdeki aynı arayüzü implemente etmek olayı kafanızı karıştırmasın, benim örnekte kullandığım IMedia interface’i gereksiz olmuş, sonradan farkettim. Eğer sorunuzu yanlış anlamadıysam, hız kaybı olacağını söylemek veya buradaki kullanımlarla kıyaslamak doğru olmaz.

  2. Hocam aslında IMedia kullanılabilirdi..

    static void PlayMedia<T>(T media) where T : IMedia

    media.Play();

    olursa hepsinden hızlı oluyor :)

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir