Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Performans Testi (CodeDOM ile)


Özet
Aynı işi gören iki farklı koddan hangisinin daha performanslı çalıştığını test etmenizi sağlayan program. İki ayrı kutuya kodlarımızı yazıp, hangisinin daha performanslı çalıştığını derlemeden görebil

Yazar Hakkında
Şehir :
İstanbul

Üyelik :
06 Ocak 2005 06:46

Son Giriş :
24 Temmuz 2017 21:23
» Mesaj gönder
» fizikci hakkında
» Sözlükte fizikci
Downloads :

compiled_171.zip
source_172.zip

Giriş

Yazılımda aynı kodu farklı şekillerde yazmak mümkün. Bunlardan hangisinin daha iyi olduğuna karar vermek için bir takım kriterler var. Bu kriterler arasında performans, kaynak kullanımı, okunabilirlik gibi başlıkları sayabiliriz. Bunların en önemli olanlarından biri şüphesiz performans.

İki farklı kodu bir döngü içerisinde mesela 1000 defa çalıştırarak hangisinin kaç ms sürdüğünü ölçmek programcıların sıklıkla başvurduğu bir performans testidir. Fakat bunun için yeni bir proje oluşturup, kodları yazıp, derlemek, hataları düzeltip bir daha derlemek :) gerekir ki zaman alıcı ve sıkıcı bir iştir.

Bu program işte bu sorunu çözmek için yazılmıştır. Sadece iki farklı alana iki farklı kodu yazıyorsunuz, kaç defa çalıştırılacağını belirleyip testi başlatıyorsunuz.


Programın kullanımı

Program çalıştırıldığında daha önce hazırlanmış testlerin listelendiği bir ekran açılıyor. Bu ekranda;
Open selected : Listeden seçtiğiniz testi görüntüler
Delete selected: Seçilen testi siler
Add new performance test: Yeni bir test hazırlayabileceğiniz ekranı açar.

Testlerin görüntülendiği ekranda;
Name: Teste bir isim vermenizi sağlıyor.
How many times? : Test edilecek kodların kaçar defa çalıştırılacağını soruyor.
First Code : Run() metodunun içine test etmek istediğiniz birinci kodu yazıyorsunuz.
Secon Code : Run() metodunun içine First Code ile karşılaştırmak istediğiniz ikinci kodu yazıyorsunuz.
Test! : Bu buton ile testin başlamasını sağlıyorsunuz. Test tamamlandığında Execution Time alanlarında her bir kodun ms cinsinde çalışma süresi gösteriliyor.


Kullanılan teknolojiler

Bu programda testlerin derlenip çalıştırılması için CodeDOM teknolojisi, testleri kaydetmek için de ADO.NET kullanıldı.

Kaynak kodları

Kodun test işleminin yapıldığı önemli kısmı aşağıda verilmiştir:


// cursoru bekleme konumuna alalım
this.Cursor = Cursors.WaitCursor;

// CodeDOM'dan C# compiler'ı elde edelim
Microsoft.CSharp.CSharpCodeProvider cp = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.ICodeCompiler ic = cp.CreateCompiler();

// compiler parametrelerini ayarlayalım
System.CodeDom.Compiler.CompilerParameters cpar = new System.CodeDom.Compiler.CompilerParameters();
cpar.GenerateInMemory = true;
cpar.GenerateExecutable = false;
cpar.ReferencedAssemblies.Add("system.dll");
cpar.ReferencedAssemblies.Add("System.Drawing.dll");
cpar.ReferencedAssemblies.Add("System.Windows.Forms.dll");
cpar.ReferencedAssemblies.Add("System.Data.dll");
cpar.ReferencedAssemblies.Add(Application.ExecutablePath);

// CodeDOM ile derlenecek olan kodu oluşturalım
string src = "";
src += "using System;\r\n";
src += "using PerformanceTest;\r\n";
src += "using System.Collections;\r\n";
src += "using System.Windows.Forms;\r\n";
src += "using System.Data;\r\n";
// test için yazılan iki kodu da bu koda ekleyelim
src += txtFirstCode.Text + "\r\n" + txtSecondCode.Text;

// kodu derletim ve sonuçları alalım
System.CodeDom.Compiler.CompilerResults cr = ic.CompileAssemblyFromSource(cpar,src);

// eğer derleme hatası varsa bu hataları bir bir gösterelim.
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
    // hata mesajı, hatanın oluştuğu satır, önceki üç satır ve sonraki üç satırı içeren
    // bir hata mesajı hazırlayalım.
    string[] srcArr = src.Split('\n');
    string errMessage = ce.ErrorText + " at line " + (ce.Line-1) + "\n\n";
    for(int i=ce.Line-3; i<ce.Line+3; i++)
    {
        if(i<0 || i>=srcArr.Length)
            continue;
        errMessage += i + " " + srcArr[ i] + "\n";
    }
    // hatayı gösterelim
    MessageBox.Show(errMessage);
   
    // cursor'u default haline getirelim ve sadece bir hata mesajı göstermek için koddan çıkalım.
    this.Cursor = Cursors.Default;
    return;
}

// kod hatasız derlendiyse test işlemlerine başlayalım.
if (cr.Errors.Count == 0 && cr.CompiledAssembly != null)
{
    // test edilecek iki koda (sınıfa) ait tipleri elde edelim.
    Type firstCodeType = cr.CompiledAssembly.GetType("TheCode");
    Type secondCodeType = cr.CompiledAssembly.GetType("TheAlternativeCode");
    try
    {
        if (firstCodeType != null && secondCodeType != null)
        {
            // bu tiplerden CodeToTest tipinde birer instance oluşturalım
            CodeToTest firstCodeInstance = (CodeToTest) Activator.CreateInstance(firstCodeType);
            CodeToTest secondCodeInstance = (CodeToTest) Activator.CreateInstance(secondCodeType);

            // ilk kodu n defa çalıştıralım ve başlangış ve bitiş tarihlerini set edelim
            firstCodeInstance.Start = DateTime.Now;
            for(int i=0; i<txtHowMany.Value; i++)
                firstCodeInstance.Run();
            firstCodeInstance.End = DateTime.Now;

            // ikinci kodu n defa çalıştıralım ve başlangış ve bitiş tarihlerini set edelim
            secondCodeInstance.Start = DateTime.Now;
            for(int i=0; i<txtHowMany.Value; i++)
                secondCodeInstance.Run();
            secondCodeInstance.End = DateTime.Now;

            // ms cinsinde çalışma sürelerini ekranda gösterelim.
            TimeSpan ts = firstCodeInstance.End - firstCodeInstance.Start;
            txtFirstCodeExecTime.Text = Convert.ToInt64(ts.TotalMilliseconds).ToString();
            ts = secondCodeInstance.End - secondCodeInstance.Start;
            txtSecondCodeExecTime.Text = Convert.ToInt64(ts.TotalMilliseconds).ToString();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

// cursoru eski haline getirelim.
this.Cursor = Cursors.Default;




Yazarımıza ait diğer makaleler

1. Javascript ve HTML ile grafik çizmek
SVG ile grafik çizmek HTML ve Javascript kasmaktan daha mantıklı elbet ama SVG yaygınlaşana kadar bir müddet daha böyle idare ediyoruz.
08 Aralık 2006 01:45

2. Veritabanı hakkında yapısal bilgiye erişmek (Database metadata)
Veritabanı hakkında yapısal bilgiye (metadata) erişim için yazılmış açık kaynak kodlu kütüphane.
18 Kasım 2006 21:51

3. Javascript ile Nesne Yönelimli Programlama (OOP with JS)
Bu makalede Javascript'le ilgili olarak JSON, function pointer ve OOP konuları ele alınıyor.
21 Ekim 2006 15:29

4. Code Generation, Code Generator nedir?
Code generation adını sıkça duyduğumuz bir kavram. Kod yazan kodların yaptığı işe deniyor. Kod da kod yazar mıymış demeyin. Programlarsanız yazıyor. Hem de ne kadar iyi programlarsanız o kadar iyi yazıyor. Hatta öyle ki; bazı code generatorlar artificial intelligence sınırlarını zorlayan kodlar bile üretebiliyor. Bu tür programları gören kimi programcıların da tüyleri diken diken oluyor, "ulan patron bunu görse beni kapının önüne koyar ha" diye.
24 Eylül 2006 07:00

5. Geçmişten Günümüze Bilgisayar - II (mizah)
Bir önceki makalemizde (bkz. Geçmişten Günümüze Bilgisayar (mizah)) kısaca bilgisayarın tarihçesinden bahsetmiş ve programlara dillerini anlatmaya başlamıştık. Bu makalemizde programlama dillerini anlatmaya devam ediyoruz.
01 Haziran 2006 18:27

6. Geçmişten Günümüze Bilgisayar (mizah)
...Ama aslında abaküsün günümüz bilgisayarlarıyla herhangi bir benzerliği olduğu söylenemez. Bir kere abaküsle İnternet'e bağlanamazsınız. Counter Strike da yok. Eee? Nasıl bilgisayar bu? Varsa yoksa boncuk! Üç boncuk sağa, iki boncuk sola. Ne anladım ki ben bundan?
28 Mart 2006 10:38

7. Bir PHP Hikayesi - Bölüm VI - Biraz da Javascript hikayesi
Erol PHP ortamlarından Javascript ortamlarına akıyor.
26 Şubat 2006 01:42

8. SPAM ile mücadele
Bir spamci ile aramda geçen mesajlaşmayı yayınlamak istedim. İbreti alem olsun diye.. :)
04 Şubat 2006 12:00

9. Multithreading - Bölüm I
Threading serimizin bu ilk bölümünde konuya kısa bir giriş yapıyoruz.
11 Ekim 2005 01:38

10. Bir PHP Hikayesi - Bölüm V : PHP mi? Ne PHPsi?
Bir Pazar günü Erol'un başından geçenler. Tarumar'ın katkılarıyla.
04 Eylül 2005 14:59

11. Bir PHP hikayesi - Bölüm IV : Web Formları
Bu bölümde Sinan'la Erol'u biraz daha yakından tanıyoruz.. Ha, bir de şu web formlarından bahsediyoruz.
27 Ağustos 2005 17:00

12. Bir PHP hikayesi - Bölüm III : PHP dili
Bu bölümde Erol PHP dili ile biraz daha tanışıyor, Sinan'ın rehberliğinde yeni dünyalara yelken açmanın tadını çıkartıyor.
21 Ağustos 2005 19:29

13. Bir PHP hikayesi - Bölüm II : PHP'ye giriş
Bu bölümde PHP'ye nefes kesen bir giriş yapılıyor. Sinan heyecanla anlatıyor, Erol'un bilginin sınırlarında şakakları zonkluyor.
21 Ağustos 2005 02:36

14. Bir PHP hikayesi - Bölüm I : Kurulum
PHP öğrenmek isteyen bir programcı ve PHP bilen bir başka programcının diyalogları. Çok sürükleyici! :)
20 Ağustos 2005 18:33

15. OOP - Nesne Yönelimli Programlama - Bölüm III
Bu makalemizde inheritance (kalıtım) konusuna değineceğiz.
29 Temmuz 2005 00:59

16. OOP - Nesne Yönelimli Programlama - Bölüm II
Bu makalemizde encapsulation (kapsülleme) kavramından bahsediyoruz.
19 Temmuz 2005 10:24

17. OOP - Nesne Yönelimli Programlama - Bölüm I
Artık ister istemez her programcının bulaştığı bu teknik hakkında sayısız makale yazılmıştır bu güne kadar. Bu makale de onlardan biri.
30 Haziran 2005 22:58

18. DHTML ile sayfa refresh olmadan dinamik olarak değişen veri göstermek
Veritabanı uygulamaları geliştirmek için belkide en güzel yöntem olan webin küçük bir sorunu var: Sürekli refresh olan sayfalar..
17 Haziran 2005 23:43

19. Virtual domainlerde karşılaşılan mail probleminin Sendmail ile çözümü
Bu yazi 2001 yilinda "Türk Linuxçülerine bir ucundan biz de destek olalim" diye linux.com'dan Türkçe'ye tercüme edilmistir.
07 Haziran 2005 21:19

20. Taş Fırın Satrancı
.Net'i denemek, öğrenmek için zamanında yazılmış bir program ve o zamanlar kendisi hakkında yazılmış bir makale.
06 Haziran 2005 21:25

21. Yüklü Parçacıklar Simulasyonu
Bir simulasyon programı. Bu programı parçacık sistemlerinin birbirleriyle etkileşimini incelemek için kullanabilirsiniz.
(Not: Bu program ve makale 2002 yılında yazılmıştır.)
06 Haziran 2005 20:07

Yorumlar

Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.


Bu başlığa bkz veren girişlerin başlıkları nedir?

Bu başlığa bkz veren girişler başka hangi başlıklara bkz verdiler?
» + » fizikci

© 2005, Bilişim Kulübü. (1109 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen