Geliştirdiğimiz uygulamaların performanslarına genellikle, uygulamayı geliştirmeyi bitirdikten sonra dikkat ediyoruz ne yazık ki…Geliştirme bittikten sonra müşteri söylenene kadar çok fazla bazı şeylerin farkında olamıyoruz…Performans ile ilgili konuları bilmemekten çok, daha ziyade geliştirme alışkanlığı olduğunu düşünüyorum bunun…En azından kendi çevremde gözlemlediğim durum bu şekilde.

Performans, yazılımın kalitesini etkileyecek bir etken olabiliyor bazen. Belki ilk geliştirme aşamasında değil ama sonradan kalitesini direk belirleyen bir faktör olabiliyor. Bundan dolayı geliştirme aşamasında uygulamamızın performansını nasıl kontrol eder ve gözlemleriz bunu örneklendirmeye çalışacağım. Tabi ki bunu Visual Studio 2010 ile yapıyor olacağız…

Öncelikle çok basit bir konsol uygulaması yapalım. Performansını gözlemleyeceğimiz uygula olarak bu uygulamayı düşünebiliriz.

    public class DummyClass
    {

        public void DoSomething()
        {
            string s = "";

            for (int i = 0; i < 10000; i++)
            {
                s += "Performance test:" + i;
                s += "\r\n";
            }
            Console.WriteLine(s);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DummyClass dummy = new DummyClass();
            dummy.DoSomething();

            Console.ReadLine();

        }
    }

Fark etmiş olduğunuz üzere çok komplike bir yapı yok…10.000 kere çalışan bir döngü içerisinde bir string değişkenine değer atıyoruz…Şimdi bu yazdığımız kodun performansını gözlemleyelim. Bunun için Visual Studio’nun Analyze menüsünden Launch Performance Wizard… seçeneğini seçmemiz gerekte.

Bu seçeneği seçtikten sonra çeşitli performans ölçümleri için seçenekler karşımıza çıkacaktır.

  • CPU Sampling: Uygulamanın işlemci üzerinde ne kadar yük oluşturduğunu ölçmek adına bu seçeneği kullanabiliriz.
  • Instrumentation: Uygulamanın içerisinde ki metodlar kaç kere çağrılmış ve bir metodun işlemini ne kadar sürede yapmış gibi bilgileri gözlemlemek için bu seçeneği seçebiliriz.
  • .NET Memory Allocation: Uygulamanın bellek kullanımı ile ilgili performansını gözlemlemek için seçeceğimiz seçenek de bu seçenek olmalı.
  • Concurrency: Eğer multi-thread bir uygulamamız var ise thread’lar arasında ki ilişkileri bu seçenek ile gözlemleyebiliriz.

Bu yazı için CPU Sampling seçeneğini seçip Next diyoruz…Daha sonra aşağıdaki gibi bir ekran ile performans analizi yapacağımız projeyi ya da uygulamayı seçmemiz gerekiyor. Açık projeler var ise onlar listede çıkıyor olacaktır.

Projemizi seçip yine Next diyoruz. Bir sonra ki ekranda artık performans analizini çalıştırmak için son adımı tamamlıyoruz,yani bu ekranları kapattıktan sonra analiz operasyonunu başlat seçeneğini seçiyoruz. Eğer analizi daha sonra çalıştırmak istersek bu seçeneği seçmeyip, direk Finish diyebiliriz.

Finish dedikten sonra uygulamamız kendiliğinden çalışacaktır. Ve arka tarafta analiz işlemi de uygulamamız ile paralel çalışıyor olacaktır.

Uygulamamızı kapattıktan sonra performans analizide tamamlanmış olacaktır. Tabi ki kapatmadan önce uygulamamızda ne yapmak istiyorsak, o operasyonları yapmamız daha mantıklı veriler içeren bir analiz raporu oluşmasını sağlar. Aşağıdaki gibi bir rapor analiz sonunca karşımıza çıkacaktır.

 

Bu rapor ile uygulamızda performans adına ne gibi iyileştirmeler yapabiliriz bunları tespit etmek mümkün. Raporda ilgili metodlara tıklarsak bu metodların içerisinde, kodun hangi satırında, hangi metod kaynak kullanmış bu bilgiye de ulaşabiliyoruz.

 

Basit bir örnek oldu gerçi ama umarım bir uygulamanın performansını Visual Studio ile nasıl gözlemleyebiliriz sorusuna biraz olsun cevap vermiştir. Ama daha bitmedi…(:

Bu basit performans analizinden sonra, sorunu görebilmiş olduk. Bildiğiniz üzere string tipindeki değişkenlere bu şekilde bir döngü içerisinde değer atamak hem bellek hemde işlemci açısından oldukça maliyetlidir. Şimdi isterseniz bunu düzeltip raporumuza tekrar göz atalım. Ama bunun için öncelikle bu raporu kaydetmemiz lazım. Daha sonra aşağıda ki gibi kodumuzu değiştirdikten sonra raporumuzu tekrar çalıştırıyoruz aynı şekilde…

 

    public class DummyClass
    {

        public void DoSomething()
        {
            //string s = "";
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 10000; i++)
            {
                //s += "Performance test:" + i;
                //s += "\r\n";
                sb.Append("Performance test:" + i);
                sb.Append("\r\n");
            }
            //Console.WriteLine(s);
            Console.WriteLine(sb.ToString());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DummyClass dummy = new DummyClass();
            dummy.DoSomething();

            Console.ReadLine();

        }
    }

Yukarıdaki düzeltmeden sonra raporumuz aşağıdaki gibi olacaktır. Dikkat edersiniz ki işlemci açısından ilk rapordaki gibi bir durum söz konusu değil. string değişkeni yerine StringBuilder sınıfını kullanarak işlemci yükünü azaltmış olduk. Burada Console.WriteLine() metodunda %100 gibi bir değerin olması sizi şaşırtmasın. Normal bir değer bu. Uygulama işlemci açısından konsola yazdırmak için kullanmış tüm gücünü. Bu da aslında gayet normal…Bu noktada bu raporlarda toplam değerin mutlaka %100 olacağını belirtmekte fayda var.

Bir önceki rapor ile bu son raporu bir biri ile karşılaştırmakta mümkün. Rapor ekranından Compare Reports… seçeneği ile bir önceki raporu seçtiğinizde iki rapor arasında ki gelişmeyi görebilirsiniz.

Bu tarz performans kontrollerini uygulama geliştirme aşamasında sık sık yapmakta fayda olacağına inanmaktayım. Bu şekilde uygulama tamamlanmadan önce performans sorunlarını tespit etmek çok daha kolay olacaktır.

Şimdilik bu kadar, bir sonra ki yazıda görüşmek üzere…