Results 1 to 7 of 7

Thread: Performantieverschil VCL - WinForms

  1. #1

    Performantieverschil VCL - WinForms

    Ik heb een kleine app gemaakt om de WinForms eens even te toetsen aan de VCL. Ik heb hierbij een groot performantie verschil opgemerkt.

    De app:
    Een form met een listview en een knop om de listview te vullen.
    Ik lees 10.000 records met personen uit een Access databank en toon deze in een listview.

    Zowel voor de WinForms als de VCL.NET gebruikt ik een klasse Persoon (ID, Naam, Voornaam) en een klasse waar ik de personen in een objectlist steek.
    In beide gevallen gebruik ik ADO (BdpConnection, BdpCommand) en een DataReader om de data op te halen. Het ophalen van de data, inclusief de objectlist vullen gaat in beide gevallen snel (minder dan 1 sec).

    Het verschil zit hem in het opvullen van de ListView.
    In WinForms duurt dit +- 2 sec, in VCL 43 sec !!

    Heeft iemand hier een verklaring voor ?

  2. #2
    edit: laat maar verkeerd gelezen

    toch iets

    Je gebruikt hier datareader. Als ik zo lees in de .NET framework sdk:

    You can use the ADO.NET DataReader to retrieve a read-only, forward-only stream of data from a database. Using the DataReader can increase application performance and reduce system overhead because only one row at a time is ever in memory.
    Datareader is veel sneller omdat het alleen read only en forward only dataset is. Misschien dat daar een verschil uit maakt. Aangezien ADO in VCL dat niet heeft.

  3. #3
    Ik denk dat GeertVNieuw bedoelt dat het enige verschil de VCL TListView of de .Net ListView is.

    Hoe vul je beide? Laat eens wat code zien? Gebruik je bijvoorbeeld BeginUpdate EndUpdate bij de VCL TListBox?
    We adore chaos because we like to restore order - M.C. Escher

  4. #4
    Code VCL.NET
    Het is dus de loop om de listview te vullen die hier blijkbaar een stuk trager is.

    Code:
      myPersonList := TPersonList.create;
      myPersonList.LoadPersons; //Dit gaat dus snel
      for i := 0 to pred(myPersonList.Persons.Count) do
        begin
          x := TListItem.Create(ListView1.Items);
          x.Caption := IntToStr(myPersonList.Person[i].ID);
          x.SubItems.Add(myPersonList.Person[i].Name);
          x.SubItems.Add(myPersonList.Person[i].FirstName);
          ListView1.Items.AddItem(x);
        end;
      myPersonList.Free;
      LockWindowUpdate(0);
    Code WinForms ==> betere performantie

    Code:
      
      myPersonList := TPersonList.create;
      myPersonList.LoadPersons;//Dit gaat dus snel
      //Fill the listview
      edStartList.Text := (DateTime.Now).ToLongTimeString;
      for i := 0 to pred(myPersonList.Persons.Count) do
        begin
          lstvItem := ListViewItem.Create(Convert.ToString(myPersonList.Person[i].ID));
          lstvItem.SubItems.Add(myPersonList.Person[i].Name);
          lstvItem.SubItems.Add(myPersonList.Person[i].FirstName);
          ListView1.Items.Add(lstvItem);
        end;
      myPersonList.Free;

  5. #5
    Probeer dat eens:
    Code:
     
      myPersonList := TPersonList.create;
      myPersonList.LoadPersons; //Dit gaat dus snel
      ListView1.Items.BeginUpdate;  // nieuw
      for i := 0 to pred(myPersonList.Persons.Count) do
        begin
          x := TListItem.Create(ListView1.Items);
          x.Caption := IntToStr(myPersonList.Person[i].ID);
          x.SubItems.Add(myPersonList.Person[i].Name);
          x.SubItems.Add(myPersonList.Person[i].FirstName);
          ListView1.Items.AddItem(x);
        end;
      ListView1.Items.EndUpdate;  // nieuw
      myPersonList.Free;
      LockWindowUpdate(0);
    Als je kijkt naar de source van VCL for .Net zie je dat het praktisch onveranderd is van de originele win32. Wellicht dat daar de inefficiente vandaan komt. Het grote voordeel van VCL for .Net is dat het zo erg lijkt op de originele en daarom tijd bespaart bij het omzetten van win32 naar .Net en bij de omschakeling van de programmeurs.
    We adore chaos because we like to restore order - M.C. Escher

  6. #6
    LL,
    ik heb jouw toevoegingen aan de code geprobeerd maar het resultaat is hetzelfde.
    Ik heb ondertussen dezelfde app eens in D7 gemaakt, en voor de volledigheid ook maar even in C#.
    D7:
    Enige verschil is dat ik een TADOQuery gebruik in D7 om de data op te halen. Resultaten van D7: data ophalen (de query) 5 seconden, listview vullen 20 seconden.
    Dus D7 presteerd beter dan VCL.NET.

    C#
    Volledige operatie (inlezen records en tonen in listview) duurt 2 seconden. Dus de C# resultaten zijn vergelijkbaar met de Delphi WinForms (logisch, zelfde framework, zelfde componenten, ...

    Het resultaat van D7 is waarschijnlijk niet onlogisch, jouw laatste opmerking in gedachten ...
    Ik moet wel zeggen dat mijn zin om over te stappen naar VCL.NET niet echt wordt aangewakkerd op deze manier. De performantietesten van de WinForms kunnen mij daarentegen wel bekoren.
    Het is echter nog vroeg om conclusies te trekken op basis van een paar kleine testen. De toekomst zal het wel uitwijzen.

    Alvast bedankt voor jouw medewerkingen aan deze kleine test.

  7. #7
    Maar waarom zou je overstappen naar VCL.NET dan? De enige reden die ik daarvoor kan verzinnen is dat je klant .NET compatibiliteit eist van een bestaand product. Elk nieuw product laat je de VCL uiteraard links liggen.
    Marcel

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. WinForms en panel alignment
    By Vos in forum .NET
    Replies: 10
    Last Post: 21-Jul-04, 14:17
  2. Overview of the VCL for .NET
    By Marcel in forum Delphi.NET / Web services
    Replies: 0
    Last Post: 12-Jan-03, 23:07
  3. VCL 8.5 van Crystal Reports
    By Mani in forum Algemeen
    Replies: 2
    Last Post: 24-Oct-02, 00:46
  4. Probleem Crystal Reports VCL component
    By JDN in forum Databases
    Replies: 2
    Last Post: 09-Jul-02, 23:17
  5. Ergernis over opzet VCL ...
    By Bas in forum Algemeen
    Replies: 6
    Last Post: 27-Dec-01, 14:01

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •