Programmas Delphi atmiņas optimizēšana

Rakstot ilgstošas ​​lietojumprogrammas - tāda veida programmas, kuras lielāko dienas daļu pavadīs līdz uzdevumjoslai vai sistēmas teknē, var kļūt svarīgi neļaut programmai “aizbēgt” ar atmiņas izmantošanu.

Divās labākajās kolonnās ir norādīts CPU (laika) un atmiņas patēriņš. Ja process nopietni ietekmē kādu no šiem, jūsu sistēma palēnināsies.

Tāda lieta, kas bieži ietekmē CPU izmantošanu, ir programma, kurai ir cilpa (jautājiet jebkuram programmētājam, kurš ir aizmirsis faila apstrādes cilpā ievietot paziņojumu “lasīt nākamo”). Šāda veida problēmas parasti ir diezgan viegli novērst.

No otras puses, atmiņas izmantošana ne vienmēr ir acīmredzama, un tā ir jāpārvalda vairāk, nekā jālabo. Piemēram, pieņemsim, ka darbojas uztveršanas veida programma.

Šī programma tiek izmantota visu dienu, iespējams, telefona uztveršanai palīdzības dienestā vai kādu citu iemeslu dēļ. Nav jēgas to izslēgt ik pēc divdesmit minūtēm un pēc tam sākt to no jauna. To izmantos visu dienu, lai arī reti.

Ja šī programma paļaujas uz kādu smagu iekšēju apstrādi vai tās formās ir daudz mākslas darbu, agrāk vai vēlāk tā būs

instagram viewer
atmiņas izmantošana pieaugs, atstājot mazāk atmiņas citiem biežākiem procesiem, palielinot peidžeru darbību un galu galā palēninot datoru.

Teiksim, ka jūs plānojat izveidot programmu ar galveno formu un divām papildu (modālām) formām. Parasti atkarībā no jūsu Delphi versijas Delphi veidlapas ievietos projekta vienība (DPR fails), un tajā būs iekļauta līnija visu veidlapu izveidošanai lietojumprogrammas startēšanas laikā. Izveidot veidlapu (...)

Projekta vienībā iekļautās līnijas ir izstrādātas ar Delphi dizainu un ir lieliski piemērotas cilvēkiem, kuri nav pazīstami ar Delphi vai tikai sāk to izmantot. Tas ir ērti un noderīgi. Tas arī nozīmē, ka VISAS veidlapas tiks izveidotas, kad programma tiks palaista, un NAV, kad tās būs vajadzīgas.

Atkarībā no tā, kas ir jūsu projekts, un formas ieviestā funkcionalitāte var izmantot daudz atmiņas, tāpēc formas (vai vispār: priekšmeti) būtu jāizveido tikai pēc nepieciešamības un jāiznīcina (jāatbrīvo), tiklīdz to vairs nav nepieciešams.

Gan "DialogForm", gan "OccasionalForm" ir jāizņem no saraksta "Automātiski izveidot veidlapas" un jāpārvieto uz sarakstu "Pieejamās formas".

Lūdzu, ņemiet vērā, ka šeit izklāstītā stratēģija balstās uz pieņēmumu, ka attiecīgā programma ir reāllaika “uztveršanas” tipa programma. Tomēr to var viegli pielāgot partijas tipa procesiem.

Delfi ir mēģinājis to samazināt līdz minimumam, un tai ir sava atmiņas pārvaldības arhitektūra, kas izmanto daudz mazākus blokus, bet tas tā ir praktiski bezjēdzīgi Windows vidē, jo atmiņas piešķiršana galu galā gulstas uz operētājsistēmu.

Kad Windows ir atvēlējis procesam atmiņas bloku un šis process atbrīvo 99,9% no atmiņas, Windows joprojām uztvers visu bloku, kas tiek izmantots, pat ja faktiski tiek izmantots tikai viens bloka baits izmanto. Labā ziņa ir tā, ka Windows patiešām nodrošina šīs problēmas novēršanas mehānismu. Apvalks nodrošina mums API ar nosaukumu SetProcessWorkingSetSize. Šeit ir paraksts:

Pēc definīcijas Funkcija SetProcessWorkingSetSize iestata noteiktā procesa minimālos un maksimālos darba kopas izmērus.

Šī API ir paredzēta, lai procesa atmiņā izmantoto vietu minimālā un maksimālā atmiņas robežas varētu iestatīt zema līmeņa. Tomēr tajā ir iebūvēts neliels ķeksītis, kas ir visveiksmīgākais.

Ja gan minimālās, gan maksimālās vērtības ir iestatītas uz USD FFFFFFFF, tad API īslaicīgi saīsina iestatīto lielumu līdz 0, mainot to no atmiņas un tūlīt pēc tā atgriežas RAM, tam būs atvēlēts minimālais atmiņas apjoms (tas viss notiek pāris nanosekundēs, tāpēc lietotājam tas būtu nemanāms).

Zvans uz šo API tiks veikts tikai noteiktos laika intervālos - nevis nepārtraukti, tāpēc veiktspējai vispār nevajadzētu būt ietekmei.

Tagad periodiski pārbaudiet pēdējo ērču skaitu pret “Tagad” un, ja starpība starp diviem ir lielāka nekā periods, kas tiek uzskatīts par drošu dīkstāves periodu, sagrieziet atmiņu.

Tagad izlemiet, pēc kāda laika jūs uzskatīsit programmu par dīkstāvi. Manā gadījumā mēs nolēmām divas minūtes, taču atkarībā no apstākļiem jūs varat izvēlēties jebkuru vēlamo periodu.

Pielāgot šo metodi ilgstošiem apstrādes periodiem vai sērijveida procesiem ir pavisam vienkārši. Parasti jums ir laba ideja, kur sāksies ilgs process (piemēram, cilpas lasīšanas sākums miljoniem datu bāzes ierakstu) un kur tas beigsies (datu bāzes lasīšanas cilpas beigas).

Procesa sākumā vienkārši atspējojiet taimeri un procesa beigās to atkal iespējojiet.

instagram story viewer