İlkay İlknur

just a developer...

.NET Framework Beta 2 - Dynamic Language Runtime Performans İncelemesi

Merhaba Arkadaşlar, Bu yazımızda daha önce sürekli bahsettiğimiz ama bir türlü somut verilerle gözlemlemediğimiz Dynamic Language Runtime'ın performansına göz atıyor olacağız. Bildiğiniz gibi DLR içerisinde bulunan Call Site Caching mekanizması bizim yaptığımız dinamik çağrımları içerisinde cacheleyip ileriki çağrımlarda kodun daha hızlı işletilmesini sağlamakta. Biz de bu yazı boyunca DLR'ın içerdiği çeşitli mekanizmalar üzerinde yaptığımız dinamik çağrımları gözlemleyeceğiz ve Call Site Caching'in aslında ne kadar faydalı olduğunu somut veriler ile bir daha anlayacağız.

Object Binder

Object Binder mekanizmasını test ederken karşılaştırma yapacağımız yöntem reflection mekanizması olacak. Arka arkaya hem dinamik hem de reflection kodlarını işleteceğiz ve her bir kodun işletilmesi ne kadar sürüyor bunu gözlemleyeceğiz. Test için öncelikle basit bir Foo sınıfı tasarlayacağız ve içerisine bir property bir de bu propertyi ekrana yazan bir metot ekleyeceğiz. Daha sonra ise bu propertyi hem dinamik hem de reflection ile değiştirip sonra yine bu iki farklı mekanizma ile metot çağrımını gerçekleştireceğiz. Kodlar ise şu şekilde olacak. class Foo     {            public string MyProperty { get; set; }    public void Print()    {        HttpContext.Current.Response.Write("<br/>MyProperty = " + MyProperty);    } } Daha sonra ise Test metotlarını yazıyoruz.
protected void TestwithReflection()
{
   object obj = new Foo();
   Stopwatch watch = new Stopwatch();
   for (int i = 1; i < 11; i++)
   {
       watch.Restart();
       obj.GetType().GetProperty("MyProperty").SetValue(obj, string.Format("Test with Reflection -{0}", i), null);
       obj.GetType().GetMethod("Print").Invoke(obj, null);
       watch.Stop();
       Response.Write("&nbsp;&nbsp;&nbsp;Elapsed Time :<strong>" + watch.Elapsed.TotalMilliseconds + "</strong>");
   }
}
protected void TestwithDLR()
{
   dynamic obj = new Foo();
   Stopwatch watch = new Stopwatch();
   for (int i = 1; i < 11; i++)
   {
      watch.Restart();
      obj.MyProperty = string.Format("Test with DLR -{0}", i);
      obj.Print();
      watch.Stop();
      Response.Write("&nbsp;&nbsp;&nbsp;Elapsed Time :<strong>" + watch.Elapsed.TotalMilliseconds + "</strong>");
   }
}
Uygulamamızı çalıştırdığımızda ise aşağıdaki gibi bir sonuçla karşılaşıyoruz.
Gördüğümüz gibi DLR sadece ilk çağrımda çeşitli çözümlemeler yaptığından dolayı fazla zaman harcamaktadır. Ancak yapılan diğer çağrımlarda reflectiona oranla çok daha hızlı bir şekilde kodun işletilmesi söz konusu olmaktadır.

Javascript Binder

Test yapacağımız bir diğer platform ise Silverlight olacak. Bu sefer kodlarımızı hem javascript hem de dinamik olarak C# tarafında yazacağız ve işletim sürelerini inceleyeceğiz. Çalıştıracağımız kodda yine basit olarak result isimli div elementi içerisine 100 kere string değerler ekleyeceğiz. Kodlar ise şu şekilde olacak Javascript Kodları :  
function Test()
{
   for (var i = 0; i < 100; i++)
   {
       document.getElementById("result").innerHTML += "<br/>Call Test from javascript";
   }
}    
Daha sonra bu kodu C# tarafından hem dinamik olarak hem de window.Invoke yardımcı metoduyla çağırıyoruz.  Çıkan sonuçlar ise şu şekilde Herşey ortada Wink Not : Javascript tarafında hassas bir ölçüm yapamadığımdan dolayı aynı javascript kodunun dinamik olarak C# tarafında implemente edemedim. Javascript tarafında hassas ölçüm yöntemini araştırdıktan sonra RC sürümünde bu kullanımı da test edeceğim. Sonuçlara baktığımızda Call Site Caching yapısının DLR içerisinde ne kadar da önemli bir görev üstlendiğini görüyoruz. Böylece yaptığımız dinamik işlemler ilk çağrım haricinde yine hızlı bir şekilde yürütülmekte. Not : .NET Framework 4.0  şuanda Beta sürümünde olduğundan dolayı performanstan çok istenilen işlemlerin yapılmasına odaklanılmış durumda. Ancak Beta'dan sonra çıkacak olan sürümlerin performans açısından çok daha iyi olacaktır. Zaten .NET Framework 4.0 release tarihi de performans çalışmalarından dolayı 12 Nisan'a ertelenmiş durumda. RC sürümün çıkmasıyla yukarıdaki testleri yeniden yapacağım ve sonuçları sizinle paylaşacağım. Yaptığım örnekleri siz de buradan indirip test edebilirsiniz. Test Projects Herkese bol .NET'li günler...   


Yorum Gönder