A Delphi program memóriahasználatának optimalizálása

Hosszú futású alkalmazások írásakor - azok a programok, amelyek a nap nagy részét minimálisra csökkentik a tálcára vagy rendszertálca, fontos lehet, hogy ne hagyja, hogy a program memóriahasználattal „elfutjon”.

A két jobb oldali oszlop a CPU (idő) és a memória felhasználását jelzi. Ha egy folyamat súlyosan érinti ezeket a két tényezőt, akkor a rendszer lelassul.

Az a fajta dolog, amely gyakran befolyásolja a CPU használatát, egy hurkoló program (kérje meg minden programozót, aki elfelejtette a "következő olvasás" nyilatkozatot beilleszteni a fájlfeldolgozó hurokba). Az ilyen típusú problémákat általában meglehetősen könnyű megoldani.

A memóriahasználat viszont nem mindig nyilvánvaló, ezért inkább kezelni, mint javítani kell. Tegyük fel például, hogy egy rögzítési típusú program fut.

Ezt a programot egész nap használják, esetleg telefonos rögzítésre egy ügyfélszolgálatnál, vagy más okból. Csak nincs értelme húsz percenként leállítani, majd újra indítani. A nap folyamán fogják használni, bár ritkán.

instagram viewer

Ha ez a program valamilyen nehéz belső feldolgozásra támaszkodik, vagy rengeteg alkotást tartalmaz annak formáin, előbb vagy utóbb megteszi memóriahasználat növekszik, kevesebb memóriát hagyva más gyakori folyamatok számára, felgyorsítva a lapozási tevékenységet, és végül lelassítja a számítógépet.

Tegyük fel, hogy a fő forma és két további (modális) űrlap programját fogja megtervezni. Általában a Delphi verziótól függően a Delphi beilleszti az űrlapokat a projekt egység (DPR fájl), és tartalmaz egy sort az összes űrlap létrehozásához az alkalmazás indításakor. CreateForm (...)

A projekt egységbe beépített vonalak a Delphi tervezésűek, és kiválóan alkalmasak azok számára, akik nem ismerik a Delphit, vagy csak most kezdik el használni. Ez kényelmes és hasznos. Ez azt is jelenti, hogy MINDEN űrlapot a program indításakor kell létrehozni, és NEM, amikor szüksége van rá.

Attól függően, hogy mi a projekt témája, és az űrlappal megvalósított funkcionalitás sok memóriát igényelhet, tehát Az űrlapokat (vagy általában: tárgyakat) csak szükség esetén szabad létrehozni, és megsemmisíteni (felszabadítani), mihelyt már nem léteznek szükséges.

Mind a "DialogForm", mind az "OccasionalForm" fájlt el kell távolítani az "Automatikusan létrehozott űrlapok" listáról, és át kell helyezni az "Elérhető űrlapok" listába.

Felhívjuk figyelmét, hogy az itt vázolt stratégia azon a feltevésen alapul, hogy a kérdéses program valós idejű „elfog” típusú program. Azonban könnyen adaptálható kötegelt típusú folyamatokhoz.

Delphi megpróbálta ezt minimalizálni, és rendelkezik saját memóriakezelési architektúrával, amely sokkal kisebb blokkokat használ, de ez az gyakorlatilag haszontalan a Windows környezetben, mivel a memória elosztása végül az operációs rendszerre hárul.

Miután a Windows kiosztott egy memóriablokkot egy folyamat számára, és ez a folyamat a memória 99,9% -át szabadítja fel, A Windows továbbra is észleli, hogy az egész blokk használatban van, még akkor is, ha a blokknak csak egy bájtja van használt. A jó hír az, hogy a Windows mechanizmust biztosít a probléma megoldására. A shell biztosítja az úgynevezett API-t SetProcessWorkingSetSize. Íme az aláírás:

Meghatározása szerint a SetProcessWorkingSetSize függvény beállítja a megadott folyamat minimális és maximális munkakészlet-méretét.

Ennek az API-nak az a célja, hogy lehetővé tegye a minimális és maximális memóriahatárok alacsony szintű beállítását a folyamat memóriafelhasználási területén. Ennek ellenére van egy kis aprósága, amely a legszerencsésebb.

Ha mind a minimális, mind a maximális értéket $ FFFFFFFF-re állítja, akkor az API átmenetileg 0-ra vágja a beállított méretet, kicserélve azt a memóriából, és azonnal visszatér a RAM-ba, minimális memóriamennyiséget fog hozzá rendelni (mindez néhány nanosekundumon belül történik, tehát a felhasználó számára észrevehetetlen).

Az API-t csak meghatározott időközönként hívják - nem folyamatosan, így a teljesítményre egyáltalán nem lehet hatással.

Most rendszeresen ellenőrizze az utolsó kullancsok számát a „Most” elemhez képest, és ha a kettő közötti különbség nagyobb, mint a biztonságos alapjáratnak tekinthető időszak, vágja le a memóriát.

Most döntse el, hogy mennyi ideig tartja a programot tétlen állapotban. Az én esetemben két percre döntöttünk, de a körülményektől függően bármilyen időszakot választhat.

Meglehetősen egyszerű ezt a módszert hosszú feldolgozási időkre vagy kötegelt folyamatokra adaptálni. Általában jó ötlet, hogy hol kezdődik egy hosszú folyamat (például egy hurokolvasás kezdete az adatbázis-rekordok millióinak áttekintésén keresztül) és hol ér véget (az adatbázis-olvasási hurok vége).

Egyszerűen tiltsa le az időzítőt a folyamat kezdetén, majd engedélyezze újra a folyamat végén.