WinForm, Wpf ve Access Hız Karşılaştırması
#1
Merhaba arkadaşlar;

100.000(yüzbin) kayıtlık bir tablomuz var. Amacımız burdaki "isim" alanına ait verileri bir listboxa doldurmak ve doldurma sürelerini hesaplayarak hız testi yapmak. Projemizde 2 adet "ListBox" var. Soldaki listbox Windows Form kontroludur. Sağdaki ise WPF kontroludur dolayısıyla WinForm ve WPF testini yapmış olacağız. Her iki listekutusuna da veriler Access dosyasındaki "Tablo1" isimli tablodan gelmektedir. Aynı testi ekteki Access dosyasında da bulabilirsiniz tabii Access de "ADO" ile aldım ve 100.000 kaydın listekutusuna dolmasını beklemek işkence olduğu için "5.000" kayıt ile yarışa katıldı eski dostumuz Access Wink Yine de sonuncu olmaktan kurtulamadı ama neyse..

Şimdi kodları inceleyelim ilk önce soldaki listboxa yani WinForm kontrolune verileri nasıl aldığıma bakalım.

vb.net
  1. Public Sub Baglanalim()
  2.  
  3. oleCon = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=beab.mdb")
  4.  
  5. oleComd = New OleDbCommand(strSql, oleCon)
  6.  
  7. Dim dtst As New DataSet()
  8.  
  9. Dim adpt As New OleDbDataAdapter()
  10.  
  11. Try
  12.  
  13. oleCon.Open()
  14.  
  15. adpt.SelectCommand = oleComd
  16.  
  17. adpt.Fill(dtst, "Tablo1")
  18.  
  19.  
  20. ListBox1.DataSource = dtst.Tables("Tablo1")
  21.  
  22. ListBox1.DisplayMember = "isim"
  23.  
  24.  
  25.  
  26. Catch ex As Exception
  27.  
  28. Finally
  29.  
  30. oleCon.Close()
  31.  
  32. End Try
  33.  
  34. End Sub
  35.  
  36.  
  37.  
  38. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  39.  
  40. Dim baslangic As DateTime = DateTime.Now
  41.  
  42. Baglanalim()
  43.  
  44. Dim bitis As DateTime = DateTime.Now
  45.  
  46. Dim fark As TimeSpan = bitis - baslangic
  47.  
  48. Label1.Text = "Süre: " & fark.TotalMilliseconds.ToString() & " milisaniye"
  49.  
  50. End Sub




Şimdi ise Wpf tarafına bakalım, aslında kodlarda pek bir değişklik yok..

vb.net
  1. Public Sub Baglanalim()
  2.  
  3. oleCon = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=beab.mdb")
  4.  
  5. oleComd = New OleDbCommand(strSql, oleCon)
  6.  
  7. Dim dtst As New DataSet()
  8.  
  9. Dim adpt As New OleDbDataAdapter()
  10.  
  11. Try
  12.  
  13. oleCon.Open()
  14.  
  15. adpt.SelectCommand = oleComd
  16.  
  17. adpt.Fill(dtst, "Tablo1")
  18.  
  19. Listbox1.DataContext = dtst
  20.  
  21.  
  22.  
  23. Catch ex As Exception
  24.  
  25. Finally
  26.  
  27. oleCon.Close()
  28.  
  29. End Try
  30.  
  31. End Sub



WPF de verileri bind etme kısmını XAML tarafında yaptık..

Not: XAML kodlarını mecburen "PHP" tag ı içinde yazdım yoksa htlm kodu olarak yorumluyor.. Hatta yine " < /" karakterlerini koymadığını farkettim. Taruz'a söyleyelim de "XAML" için de bir düzenleme yapsın Wink
PHP
  1. <UserControl x:Class="UserControl1"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="160" Height="258" Name="UserControl1">
  4. <Grid Width="160">
  5.  
  6. <ListBox Margin="0,29,0,27" ItemsSource="{Binding Path=Tablo1}" Name="Listbox1">
  7.  
  8. <ListBox.ItemTemplate>
  9.  
  10. <DataTemplate>
  11.  
  12. <StackPanel>
  13.  
  14. <TextBlock Text="{Binding Path=isim}" FontSize="12" />
  15.  
  16.  
  17.  
  18. </StackPanel>
  19.  
  20. </DataTemplate>
  21.  
  22. </ListBox.ItemTemplate>
  23.  
  24. </ListBox>
  25. <Button Height="23" Margin="41,0,44,0" Name="Button1" VerticalAlignment="Top">Wpf</Button>
  26. <TextBlock Height="21" Margin="1,0,0,3" Name="TextBlock1" VerticalAlignment="Bottom" />
  27. </Grid>
  28. </UserControl>




Bendeki pc ye göre "Core2 2.13 Ghz ve 2 gb Ram" ile;

Winform: 9.000 - 10.000 milisaniye aralarında (100.000 kayıt)

WPF: 1.700 - 1.900 milisaniye aralarında (100.000 kayıt) **** Şampiyon ****

Access : 12.000 - 15.000 milisaniye aralarında (5.000 kayıt)


Olarak sonuçlar aldım..

Belki hız testini derinden etkileyecek bazı noktaları kaçırıyor da olabilirim. Aynı verilerle yapılmış aynı yapıda başka testleri görmeyi de çok isterim..

Not: Aslında Access'i, .Net ile kıyasladığım kesinlikle düşünülmesin. Burası Access forumu olduğu için ve Access ile milisaniye cinsinden süre ölçme örneği olması için dahil ettim.
Javascript
  1. this.setState({sign:"Here comes the sun...."})







  Alıntı
Bu mesajı beğenenler:
#2
Merhaba Berkant..

Senin bu tür testlere merakın sayesinde biz de çok ilginç şeyler öğreniyoruz.. Ben Wpf nin winformdan daha hızlı olduğunu biliyordum ama aradaki farkın bu derecede olması beni şaşırttı doğrusu.. (Test sonucu bende winform 13.200, wpf 2.470 çıktı.. Ben bu mesajı yazarken access hala liste dolduruyordu. Smile )

Peki, sence (mükemmeli bulma adına Wink ) bu test sonucunu listeye alma yöntemi farklılıkları değiştirebilir mi? Açıkcası çok merak ediyorum..

Bu önemli ve ayrıntı gerektiren çalışman için de çok teşekkürler.. Ufkumda çığır açtın diyebilirm..



  Alıntı
Bu mesajı beğenenler:
#3
Sayın Berkant Öztürk;

Hocam, dosyayı indirdim ve Intel cpu E6420 2.13 ghz ve 2 GB Ram ile aldığım sonuç aşağıdaki resimdeki gibi... Hız süper...

Emek ve paylaşımınız için teşekkür ederim.

Size ve bu arada Sayın Taruz hocama da selam ve sevgiler..



  Alıntı
Bu mesajı beğenenler:
#4
(10-04-2010, 12:44)Taruz demiş ki: Merhaba Berkant..

Senin bu tür testlere merakın sayesinde biz de çok ilginç şeyler öğreniyoruz.. Ben Wpf nin winformdan daha hızlı olduğunu biliyordum ama aradaki farkın bu derecede olması beni şaşırttı doğrusu.. (Test sonucu bende winform 13.200, wpf 2.470 çıktı.. Ben bu mesajı yazarken access hala liste dolduruyordu. Smile )

Peki, sence (mükemmeli bulma adına Wink ) bu test sonucunu listeye alma yöntemi farklılıkları değiştirebilir mi? Açıkcası çok merak ediyorum..

Bu önemli ve ayrıntı gerektiren çalışman için de çok teşekkürler.. Ufkumda çığır açtın diyebilirm..

Taruz, WinForm tarafında DataTable yerine DataReader daha iyi bir tercih olacaktır. Belirgin şekilde daha hızlı.
Wpf de, Listbox'a DataReader ile "items.add" yöntemiyle denedim fena değildi ama DataTable ve bind ederek çok daha hızlı. Bir de LinQ ile denemek lazım ama neyse.. Wink
Javascript
  1. this.setState({sign:"Here comes the sun...."})







  Alıntı
Bu mesajı beğenenler:


Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi