Delphi-ohjelman muistin käytön optimointi

click fraud protection

Kun kirjoitat pitkäaikaisia ​​sovelluksia - sellaiset ohjelmat, jotka viettävät suurimman osan päivästä minimoituna tehtäväpalkkiin tai järjestelmälokero, voi olla tärkeätä olla antamatta ohjelmaa "karkaa" muistin käytön kanssa.

Kaksi oikeanpuoleista saraketta osoittavat suorittimen (ajan) käytön ja muistin käytön. Jos prosessi vaikuttaa jompaan kumpaan näistä vakavasti, järjestelmäsi hidastuu.

Sellainen asia, joka vaikuttaa usein prosessorin käyttöön, on silmukka-ohjelma (kysy ohjelmoijalta, joka on unohtanut laittaa "lue seuraava" -lausetta tiedostonkäsittelysilmukkaan). Tällaiset ongelmat korjataan yleensä melko helposti.

Muistin käyttö ei sitä vastoin ole aina näkyvää ja sitä on hallittava enemmän kuin korjattu. Oletetaan esimerkiksi, että sieppaustyyppiohjelma on käynnissä.

Tätä ohjelmaa käytetään oikein koko päivän, mahdollisesti puhelimen sieppaamiseen tukipalvelussa tai jostakin muusta syystä. Ei ole mitään järkeä sammuttaa sitä kahdenkymmenen minuutin välein ja käynnistää sitten uudelleen. Sitä käytetään koko päivän, vaikkakin harvoin.

instagram viewer

Jos kyseinen ohjelma luottaa jonkinlaiseen raskaaseen sisäiseen käsittelyyn tai jos sen muodoissa on paljon taidetta, ennemmin tai myöhemmin muistin käyttö kasvaa, jättäen vähemmän muistia muille useammille prosesseille, nostaen sivutoimintaa ja hidastaen lopulta tietokonetta.

Oletetaan, että aiot suunnitella ohjelman päämuodolla ja kahdella lisämuodolla (modaalimuodolla). Tyypillisesti Delphi-versiosta riippuen Delphi aikoo lisätä lomakkeet projektiyksikkö (DPR - tiedosto) ja sisältää rivin, jolla luodaan kaikki lomakkeet sovelluksen käynnistyksen yhteydessä (Sovellus. CreateForm (...)

Projektiyksikköön sisältyvät linjat ovat Delphi-muotoiltuja ja sopivat erinomaisesti ihmisille, jotka eivät tunne Delphiä tai ovat vasta alkamassa käyttää sitä. Se on kätevä ja hyödyllinen. Se tarkoittaa myös, että KAIKKI lomakkeet luodaan ohjelman käynnistyessä ja EI, kun niitä tarvitaan.

Riippuen siitä, mistä projektissa on kyse, ja lomakkeen toteuttamasi toiminnallisuudet voivat käyttää paljon muistia, joten lomakkeet (tai yleensä: esineet) tulisi luoda vain tarvittaessa ja tuhota (vapauttaa) heti, kun niitä ei enää ole välttämätön.

Molemmat, "DialogForm" ja "OccasionalForm", on poistettava "Automaattisesti luovien lomakkeiden" luettelosta ja siirrettävä "Käytettävissä olevat lomakkeet" -luetteloon.

Huomaa, että tässä hahmoteltu strategia perustuu oletukseen, että kyseinen ohjelma on reaaliaikainen ”kaappaus” -tyyppinen ohjelma. Sitä voidaan kuitenkin helposti mukauttaa erätyyppisiin prosesseihin.

Delfoi on yrittänyt minimoida tämän ja sillä on oma muistinhallintaarkkitehtuuri, joka käyttää paljon pienempiä lohkoja, mutta tämä on käytännössä hyödytön Windows-ympäristössä, koska muistin varaaminen lopulta jää käyttöjärjestelmän tehtäväksi.

Kun Windows on allokoinut muistilohkon prosessille ja prosessi vapauttaa 99,9% muistista, Windows havaitsee silti koko lohkon olevan käytössä, vaikka lohkon tosiasiassa vain yksi tavu olisi käytetty. Hyvä uutinen on, että Windows tarjoaa mekanismin tämän ongelman puhdistamiseksi. Kuori tarjoaa meille sovellusliittymän, jota kutsutaan SetProcessWorkingSetSize. Tässä on allekirjoitus:

Määritelmän mukaan SetProcessWorkingSetSize -toiminto asettaa määritetyn prosessin vähimmäis- ja enimmäiskokoiset työstöjoukot.

Tämän sovellusliittymän on tarkoitus sallia prosessin muistin käyttötilan vähimmäis- ja enimmäismäärien rajaaminen matalalla tasolla. Siihen on kuitenkin rakennettu pieni viila, mikä on onneksi.

Jos sekä vähimmäis- että enimmäisarvoksi on asetettu $ FFFFFFFF, sovellusliittymä rajaa asetetun koon väliaikaisesti arvoon 0, vaihtamalla sen muistista ja heti kun se palautuu takaisin RAM-muistiin, sille on varattu vähimmäismäärä muistia (tämä kaikki tapahtuu muutaman nanosekunnin sisällä, joten käyttäjän pitäisi olla huomaamaton).

Puhelu tähän sovellusliittymään soitetaan vain tietyin väliajoin - ei jatkuvasti, joten suorituskykyyn ei pitäisi olla mitään vaikutusta.

Tarkista nyt säännöllisin väliajoin viimeisen rastilukeman arvo Nyt ja jos niiden välinen ero on suurempi kuin ajanjakso, jota pidetään turvallisena lepotilana, leikkaa muisti.

Nyt päätä, minkä ajanjakson jälkeen katsot ohjelman olevan käyttämättä. Päätimme tapauksessani kaksi minuuttia, mutta voit valita haluamasi ajanjakson olosuhteista riippuen.

Tämän menetelmän mukauttaminen pitkiin käsittelyaikoihin tai eräprosesseihin on melko yksinkertaista. Tavallisesti sinulla on hyvä idea, mistä pitkä prosessi alkaa (esim. Silmukan lukemisen alkaminen miljoonien tietokantatietojen läpi) ja missä se loppuu (tietokannan lukusilmukan loppu).

Poista ajastin käytöstä vain prosessin alussa ja ota se uudelleen käyttöön prosessin lopussa.

instagram story viewer