Performans Analizi

Bir metodunuz var, X defa çalıştırılması ne kadar zaman alır?

Programlarımızda bazen bir metodun veya bir kod bloğunun ne kadar sürede çalıştığını ölçmek isteriz.

Bunun için Stopwatch sınıfı bize kolaylık sağlamaktadır.

Biz de bu sınıfı kullanarak kendimize özel bir PerformansAnalizi classı yazabiliriz.

Önce class:

public delegate void MetotHandler();

class PerformansAnalizi
{
    public TimeSpan ToplamSure { get; private set; }
    public TimeSpan OrtalamaSure { get; private set; }

    public void Olcumle(MetotHandler metot, int tekrar)
    {
        Stopwatch sw = Stopwatch.StartNew();
        for (int i = 0; i < tekrar; i++)
        {
            metot();
        }
        sw.Stop();
        OrtalamaSure = new TimeSpan(sw.Elapsed.Ticks / tekrar);
        ToplamSure = sw.Elapsed;
    }
}

Burada çalıştırılması istenen metodun direkt adını kullanmak yerine, bir delegate üzerinden çağrılmasını istedim. Böylece class taki for döngüsü içerisinde yazacağımız metodun imzası ile ana programda parametre olarak vereceğimiz metodun imzasının aynı olmasını sağlıyoruz. (imza: dönüş tipi, parametre sayıları, parametre tipleri)

Bir husus daha, delegate tanımlamasını dikkat ettiyseniz sınıf dışına ama aynı namespace içerisinde yaptık. Bu bir zorunluluk değil, ama bu şekilde daha bir public olarak tanımlamış olduk :) Ya da class kullanmadan kullanmayı sağladık da diyebiliriz, neyse konumuz bu değil.

Şimdi de ana programımıza dönelim:

static void HerhangiBirMetot()
{
    for (int i = 0; i < new Random().Next(20); i++)
    {
        Thread.Sleep(250);
    }
}

static void Main(string[] args)
{
    MetotHandler mh = new MetotHandler(HerhangiBirMetot);

    PerformansAnalizi pa = new PerformansAnalizi();
    pa.Olcumle(mh, new Random().Next(20));


    Console.WriteLine("Ortalama Süre: {0}", pa.OrtalamaSure.ToString());
    Console.WriteLine("Toplam Süre: {0}", pa.ToplamSure.ToString());
    Console.ReadKey();
}

Sonuç hep aynı aralıkta çıkmasın diye, metodun kaç defa çalıştırılacağını her defasında farklı kıldık.

Benzer mantıkla class içerisindeki for döngüsünün de kaç defa döneceğini rastgele belirledik.

Thread.Sleep(250); sistemin 250 ms durmasını (hiçbirşey yapmamasını) sağlar. ( = zaman gecikmesi.)

3 defa çalıştırayım ve programın çıktısını görelim:

Herkese kolay gelsin.:)