Delphi programmi mälukasutuse optimeerimine

Pikaajaliste rakenduste kirjutamisel - sellised programmid, mis veedavad suurema osa päevast minimeerides tegumiribale või süsteemisalv, võib osutuda oluliseks mitte lasta programmil mälukasutuse korral "ära joosta".

Kaks parempoolset veergu tähistavad protsessori (aja) ja mälukasutust. Kui protsess mõjutab mõlemat neist tõsiselt, aeglustub teie süsteem.

See, mis mõjutab sageli protsessori kasutamist, on programm, mis on silmuses (küsige programmeerijalt, kes on unustanud faili töötlemise ahelasse lisada avalduse "loe edasi"). Selliseid probleeme saab tavaliselt üsna hõlpsalt lahendada.

Mälukasutus seevastu pole alati ilmne ja seda tuleb hallata rohkem kui parandada. Oletame näiteks, et hõivamistüüpi programm töötab.

Seda programmi kasutatakse kogu päeva vältel, telefonitsi salvestamiseks infolauas või mõnel muul põhjusel. Pole lihtsalt mõtet seda iga kahekümne minuti tagant välja lülitada ja uuesti käivitada. Seda kasutatakse kogu päeva jooksul, ehkki harva.

Kui see programm tugineb mõnele raskele sisemisele töötlemisele või kui selle vormidel on palju kunstiteoseid, siis varem või hiljem see

instagram viewer
mälukasutus kasvab, jättes vähem mälu muudele sagedasematele protsessidele, suurendades otsingutegevust ja aeglustades lõpuks arvuti tööd.

Oletame, et kavatsete kavandada programmi põhivormi ja kahe täiendava (modaalse) vormi abil. Tavaliselt lisab Delphi sõltuvalt teie Delphi versioonist vormid projektiüksus (DPR - fail) ja sisaldab rida kõigi vormide loomiseks rakenduse käivitamisel (. CreateForm (...)

Projektiüksusesse kuuluvad read on Delphi kujunduse järgi ja sobivad suurepäraselt inimestele, kes pole Delphiga tuttavad või alles alustavad selle kasutamist. See on mugav ja abivalmis. See tähendab ka, et KÕIK vormid luuakse programmi käivitamisel ja MITTE siis, kui neid vaja on.

Sõltuvalt sellest, mis teie projektis on, ja vormi rakendatud funktsionaalsusest võib kasutada palju mälu, nii et vorme (või üldiselt: objekte) tuleks luua ainult vajaduse korral ja hävitada (vabastada) kohe, kui neid enam pole vajalik.

Mõlemad, "DialogForm" ja "OccasionalForm", tuleb eemaldada vormingute automaatse loomise loendist ja teisaldada loendisse "Saadaolevad vormid".

Pange tähele, et siin kirjeldatud strateegia põhineb eeldusel, et kõnealune programm on reaalajas „püüdmise” tüüpi programm. Seda saab aga hõlpsasti kohandada partii tüüpi protsesside jaoks.

Delphi on proovinud seda minimeerida ja tal on oma mäluhaldusarhitektuur, mis kasutab palju väiksemaid plokke, kuid see on nii praktiliselt kasutu Windowsi keskkonnas, kuna mälujaotus lasub lõpuks operatsioonisüsteemil.

Kui Windows on protsessile eraldanud mäluploki ja see protsess vabastab 99,9% mälust, Windows tajub kogu blokki endiselt kasutuses, isegi kui ploki tegelikult on ainult üks bait kasutatud. Hea uudis on see, et Windows pakub selle probleemi lahendamiseks mehhanismi. Kest pakub meile API-t, mida nimetatakse SetProcessWorkingSetSize. Siin on allkiri:

Definitsiooni järgi seab funktsioon SetProcessWorkingSetSize määratud protsessi minimaalsed ja maksimaalsed töökomplektide suurused.

Selle API eesmärk on võimaldada protsessi mälukasutuse ruumi minimaalset ja minimaalset mälupiiri seadistada. Sellesse on siiski sisse ehitatud väike veider, mis on kõige õnnelikum.

Kui nii minimaalseks kui ka maksimaalseks väärtuseks on seatud $ FFFFFFFF, siis trimmib API ajutiselt seatud suuruseks 0, vahetades selle mälust ja kohe kui see põrkub tagasi RAM-i, siis eraldatakse sellele minimaalselt minimaalset mälumahtu (see kõik juhtub paari nanosekundi jooksul, nii et kasutaja jaoks peaks see olema tajumatu).

Sellele API-le helistatakse ainult teatud ajavahemike järel - mitte pidevalt, seega ei tohiks jõudlust üldse mõjutada.

Nüüd kontrollige perioodiliselt viimase puukide arvu väärtust „Nüüd” ja kui nende kahe erinevus on suurem kui periood, mida peetakse ohutuks jõudeolekuajaks, trimmige mälu.

Nüüd otsustage, millise aja pärast peate programmi jõudeoleku ajaks. Otsustasime minu puhul kaks minutit, kuid sõltuvalt asjaoludest saate valida mis tahes perioodi, mille soovite.

Selle meetodi kohandamine pikkade töötlemiskordade või pakkimisprotsesside jaoks on üsna lihtne. Tavaliselt on teil hea idee, kus algab pikk protsess (nt silmuse lugemise algus miljonite andmebaasi kirjete kaudu) ja kus see lõpeb (andmebaasi lugemisahela lõpp).

Lülitage taimer protsessi alguses lihtsalt välja ja lubage see protsessi lõpus uuesti.

instagram story viewer