„Delphi“ programos atminties naudojimo optimizavimas

Rašant ilgai veikiančias programas - tokios programos, kurios didžiąją dienos dalį praleis iki minimumo iki užduočių juostos arba sistemos dėkle, gali būti svarbu neleisti programai „bėgti“ naudojant atmintį.

Du dešiniai stulpeliai nurodo procesoriaus (laiko) ir atminties sunaudojimą. Jei procesas labai paveikia bet kurį iš šių punktų, jūsų sistema sulėtės.

Tai, kas dažnai daro įtaką procesoriaus naudojimui, yra programa, kuri neveikia (kreipkitės į bet kurį programuotoją, kuris pamiršo į failų apdorojimo ciklą įterpti teiginį „skaityti toliau“). Šios rūšies problemos paprastai gana lengvai ištaisomos.

Atminties panaudojimas, kita vertus, ne visada yra akivaizdus ir turi būti valdomas daugiau, nei taisomas. Tarkime, kad veikia fiksavimo tipo programa.

Ši programa naudojama visą dieną, galbūt telefoniniam užfiksavimui pagalbos centre ar dėl kitų priežasčių. Tiesiog nėra prasmės jį išjungti kas dvidešimt minučių ir vėl pradėti iš naujo. Jis bus naudojamas visą dieną, nors ir nedažnai.

Jei ta programa remiasi kokiu nors sunkiu vidiniu apdorojimu arba jos formose yra daug meno kūrinių, anksčiau ar vėliau ji bus

instagram viewer
atminties naudojimas augs, palikdamas mažiau atminties kitiems dažnesniems procesams, padidins ieškos procesą ir galiausiai sulėtins kompiuterį.

Tarkime, kad jūs sukursite programą su pagrindine forma ir dviem papildomomis (modalinėmis) formomis. Paprastai, atsižvelgiant į jūsų „Delphi“ versiją, „Delphi“ ketina formas įterpti į projekto skyrius (DPR failas) ir apims eilutę, kuria sukuriamos visos formos paleidžiant programą (. „CreateForm“ (...)

Į projekto skyrių įtrauktos linijos yra sukurtos pagal „Delphi“ dizainą ir puikiai tinka žmonėms, kurie nėra susipažinę su „Delphi“ ar tik pradeda jį naudoti. Tai patogu ir naudinga. Tai taip pat reiškia, kad VISOS formos bus sukurtos paleidus programą ir NE, kai jos bus reikalingos.

Priklausomai nuo to, koks jūsų projektas, ir dėl to, ar įdiegėte formą, galite naudoti daug atminties, taigi formos (arba apskritai: objektai) turėtų būti kuriamos tik tada, kai to reikia, ir sunaikinamos (išlaisvinamos), kai tik jų nebebus būtina.

Ir „DialogForm“, ir „OccasionalForm“ reikia pašalinti iš „Automatiškai kurti formas“ sąrašo ir perkelti į „Galimų formų“ sąrašą.

Atkreipkite dėmesį, kad čia aprašyta strategija grindžiama prielaida, kad aptariama programa yra realaus laiko „gaudymo“ tipo programa. Tačiau ją galima lengvai pritaikyti paketinio tipo procesams.

Delfi bandė tai sumažinti ir turi savo atminties valdymo architektūrą, kuriai naudojami daug mažesni blokai, tačiau taip yra „Windows“ aplinkoje beveik nenaudingas, nes atminties paskirstymas galiausiai priklauso operacinei sistemai.

Kai „Windows“ procesui paskirsto atminties bloką, šis procesas atlaisvina 99,9% atminties, „Windows“ vis tiek suvoks, kad visas blokas yra naudojamas, net jei iš tikrųjų yra tik vienas bloko baitas naudotas. Geros žinios yra tai, kad „Windows“ iš tikrųjų teikia šios problemos sprendimo mechanizmą. Apvalkalas suteikia mums API, vadinamą „SetProcessWorkingSetSize“. Štai parašas:

Iš esmės „SetProcessWorkingSetSize“ funkcija nustato mažiausius ir maksimalius nurodyto proceso darbinius rinkinius.

Ši API yra skirta leisti žemo lygio minimalias ir maksimalias atminties ribas proceso atminties erdvėje. Vis dėlto jame yra šiek tiek klaidžiojimo, kuris yra sėkmingiausias.

Jei tiek mažiausia, tiek didžiausia reikšmė yra nustatyta kaip $ FFFFFFFF, tada API laikinai sumažins nustatytą dydį iki 0, iškeisdama jį iš atminties ir tuoj pat sugrįžta į RAM, jai bus skirta tik mažiausia atminties dalis (visa tai įvyksta per kelias nanosekundės, taigi vartotojui ji turėtų būti nepastebimas).

Kreipimasis į šią API bus atliekamas tik tam tikrais laiko tarpais - nepertraukiamai, todėl našumui neturėtų būti daroma jokios įtakos.

Dabar periodiškai patikrinkite paskutinių erkių skaičių pagal „Dabar“ ir, jei skirtumas tarp jų yra didesnis nei laikotarpis, kuris laikomas saugiu nenaudojamu periodu, sutrumpinkite atmintį.

Dabar nuspręskite, po kurio laiko jūs manysite, kad programa neveikia. Mano atveju nusprendėme skirti dvi minutes, tačiau priklausomai nuo aplinkybių galite pasirinkti bet kurį norimą periodą.

Pritaikyti šį metodą ilgiems apdorojimo laikotarpiams ar paketiniams procesams yra gana paprasta. Paprastai jums bus gera idėja, kur prasidės ilgas procesas (pvz., Pradės kilpos skaitymą per milijonus duomenų bazės įrašų) ir kur baigsis (duomenų bazės skaitymo ciklo pabaiga).

Tiesiog paleiskite laikmatį proceso pradžioje ir vėl įjunkite jį proceso pabaigoje.