c # - Optag og gendan applikationstilstand for hurtig .NET app opstart

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder med en open source .NET app, der tager lang tid at starte og initialisere.Det skaber tusindvis af objekter og konfigurerer dem til første gang brug. Jeg forsøger at forbedre denne opstartstid.


Er der mulighed for at fange programhukommelse ved hjælp af Windows API eller lignende, og hurtigt 'gendan' denne tilstand senere efter genstart af pc'en? I grunden er der en måde at få adgang til og gemme den underliggende hukommelse af en .NET app og få CLR'en 'absorbere' denne hukommelse på et senere tidspunkt?



  • Den nemmeste måde ville bruge Windows Hibernate til at oprette 'hiberfile.sys', og derefter gemme en kopi af denne fil (hvis det er muligt). Hver gang Windows starter, overskriver du den eksisterende hiberfile med den gemte 'rene' version til næste opstart. Dette sikrer, at du kan gemme/gendanne applikationstilstand uden at skulle håndtere hukommelse, peger og håndtag. Kunne dette arbejde?

  • En måde ville skabe en mem-disk, selvom jeg ikke ved, om restaurering er mulig. (virtuel hukommelse, der rent faktisk virker fra harddisken, så hukommelsen kan gemmes/gendannes som en simpel fil)

  • Ligner på dette spørgsmål, men lidt anderledes, da jeg ikke har noget imod at genindsætte applikationshukommelsen på den nøjagtige adresse, den blev gemt i. PC'en er helt i mine hænder, og for enkelheds skyld antager der, at der er ingen andre apps kører.

  • C # understøtter ikke fortsættelse uden for boksen, selvom Workflow Foundation i .NET 3.0 og nyere tillader, at workflows stoppes og genstartes. Jeg spekulerer på, hvordan en applikation kan opføre sig som en arbejdsgang. [2]

  • Raymond Chen argumenterer imod dette i et blogindlæg, men ikke mange tekniske data her heller. [3]

  • YAPM, en open-source proces overvågning er i stand til at 'vise/frigive/ændre beskyttelse/frigive hukommelsesområderne i den virtuelle hukommelsesplads i en proces'. Kunne det være noget, der ligner det jeg efter? [4]


Bedste reference


Hvis du vil have en uændret gemme/indlæse proces for at undgå første brug, kan du se efter serialisering. [5]


Faktisk kan du gemme hukommelsen, men du kan løse problemer, når du forsøger at gendanne den, og der er en chance for at du måske ikke har nok hukommelse, det kan ikke have en gratis blok i samme størrelse eller så videre.


Serialisering på et objektniveau eller endda en stor gruppe objekter giver dig mulighed for at gemme dem og deres tilstand på næsten identisk måde til dumpinghukommelsen, men i høj grad forenkle indlæsningen og gøre den langt mere pålidelig. .Net tilbyder temmelig god serialiseringsstøtte og kan output til binære filer (lille men versionafhængig) eller XML (større, læsbar, lidt mere fleksibel). Andre biblioteker kan tilbyde flere metoder til varierende brug (jeg tror, ​​at der er en JSON-en, som er lidt mere ordentlig endnu, men arbejder med webapps).


Afhængigt af hvordan din app fungerer, skal du muligvis/kunne oprette førstebrugsmodellerne på første gang, serialisere dem til disk og indlæse dem fra og med. Med noget arbejde skal det også være muligt at tilføje alle objekter (af forskellige typer) til en enkelt samling og serialisere det, så alle dataene kan gemmes i en fil.


Så ja det er muligt og kan faktisk være hurtigere, men ikke hvordan du oprindeligt tænkte.