[C#] Winforms\Datasets laden traag eerste keer

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het valt mij al wel vaker op dat als ik een windows forms applicatie in C# maak en de forms flink wat componenten bevatten, het eerste keer laden van een form vaak vrij lang duurd. wanneer hetzelfe form wordt afgesloten met een Close(); en er later een nieuwe instantie van hetzelfde form aanmaak wordt is de openingstijd vele malen korter.
Ik denk dat C# een aantal dingen van het form/componenten in het geheugen vast houdt of iets dergelijks?

Ik merk hetzelfde verschil bij het gebruik van datasets wanneer ik deze bijvoorbeeld gebruik voor het inladen van data in een datagrid. de eerste keer sta je echt op je data te wachten en vanaf dat moment vliegt de data er vliegensvlug in.

Heeft iemand hier ervaring mee, en een reden voor dit verschil in performance? En wellicht nog veel belangrijker een slimme oplossing om dit probleem te omzeilen?

Ik zou het prima vinden als de opstart tijd verlengt wordt door bijvoorbeeld bij het opstarten een aantal dingen te initialiseren of zoiets dergelijks..

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Zoek eens uit waar de bottleneck zit ?

Wat bedoel je met 'het laden van de datasets' ? Ik veronderstel dat je die DataSet vult met gegevens die uit de DB komen.
heb je al eens gechecked hoe lang de query er over doet om die data op te halen ? Heb je al eens een profiler gebruikt ? Heb je het execution plan van die query al eens bekeken ?

Wat zijn 'flink veel componenten' ? Over hoeveel componenten spreken we dan, en over welke componenten gaat het ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 11:43
Volgens mij wordt de eerste keer dat je je applicatie deze omgezet van MSIL naar machine code - dat duurt even ja. Als je dan een form closed en opnieuw opent is de gecompileerde versie al beschikbaar, waardoor hij sneller opent. Afhankelijk van hoeveel componenten je op je form hebt en wat er verder allemaal nog moet gecompileerd moet worden kan dat best even duren.
Voor wat betreft de dataset: als je deze vult uit een database kan hier ook caching aan de database kant een grote rol spelen.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je zou eens kunnen kijken of ngen wat verschil uithaalt. Deze zet je assembly direct om in een (native) image. Echter ngen pas niet de assembly zelf aan, maar plaatst een native versie van je assembly in een locatie vergelijkbaar met de GAC. Op het moment dat je applicatie start controleert de JIT compiler of deze al een native image van je assembly kan vinden.

Omdat ngen een per-machine optimalisatie is werkt deze alleen met uitgebreidere setups (clickonce heeft geen support voor native images).

Zelf maak ik gebruik van een bootloader. Dit is een zeer klein programmaatje welke alleen een WinForms splashscreen form toont met daarin wat gegevens van het programma. De bootloader maakt een tweede AppDomain aan met support voor shadow files, controleerd voor updates en start uiteindelijk de applicatie op. Tijdens het opstarten gebruik ik een niet zichtbaar scherm (coordinaten -1000, -1000 en 1 x 1 pixels groot.) waarin ik langzame (user) controls alvast inlaad.

Wat betreft je datagrid. Ik neem aan dat je je grid op 'Virtual' hebt ingesteld zodat alle de records welke zichtbaar zijn worden ingeladen? In WinForms moet je dan nog wel een aantal events afvangen, maar in WPF is dat een heel stuk beter opgelost.

If it isn't broken, fix it until it is..