[VB]Te groot geheugenverbruik

Pagina: 1
Acties:

  • Vjenne
  • Registratie: Oktober 2001
  • Laatst online: 04-05 00:03
Zelf ben ik niet echt een Visual Basic programmeur, maar heb gister een progje gemaakt welke connect naar mijn website zodat bezoekers kunnen zien of ik online ben. Dit doe ik met die WebBrowser in VB. Verder zit er de optie op dat hij in mijn systray verdwijnt. En dat is het hele programma, meer niet.

Nu zag ik tot mijn verbazing dat dat kreng ruim 8 mb aan geheugen verbruikte. En het meest vreemde is nog wel dat wanneer ik hem maximaliseer uit de systray en dan verklein, dat hij dan 1.3 mb verbruikt. Wat zit er dan fout in mijn app?

Zojuist heb ik ff getest met een compleet leeg project in VB6 en hier een .exe van gemaakt, maar zelfs dat verbruikt al 2.6 mb!! En ook hier verbruikt hij weer slechts ruim 1 mb als ik hem even geminimaliseerd heb. Is dit een beetje op te vangen op een een of andere manier? Heb search gebruikt, en hier hebben ze het soms over grote bibliotheken waar je dan maar mee moet leven(microsoft is bagger gebla enzo). Maar ik denk als je het even minimaliseerd dat die bibliotheken dan niet in 1 keer weg zijn en het progje werkt nog wel, dat het dan toch zou moeten kunnen, nie waar?

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

VB applicaties hebben een redelijk grote 'overhead' mbt het geheugengebruik. De getallen die je noemt zijn dan ook niet heel extreem. Helemaal als je extra controls in je applicatie gebruikt (een systray-ding misschien) dan vreet het resources.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • Vjenne
  • Registratie: Oktober 2001
  • Laatst online: 04-05 00:03
Ah ok, maar hoe kan het dan minder zijn als ik het ff geminimaliseerd heb?

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Als je een programma minimaliseert (of lang niet gebruikt) dan worden er delen van het geheugen voor dat programma wel eens 'weggegooit'. Bijvoorbeeld een dll die je programma niet zo vaak nodig heeft, die kan dan later als het nodig is weer geladen worden.
Dit zorgt ervoor dat je geheugen over houdt voor andere programma's.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • Vjenne
  • Registratie: Oktober 2001
  • Laatst online: 04-05 00:03
Is het dan niet mogelijk om dat meteen vanaf het begin te doen? Als ik het progje namelijk meteen aan het begin even minimaliseer en dan weer groter maak verbruikt hij al minder geheugen. Hij "weet" dan dus al wat hij allemaal weg kan gooien.

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Kun je ook eens kijken hoeveel geheugen je programmaatje gebruikt nadat je het een tijdje hebt laten lopen in de achtergrond? (dus niet geminimaliseerd)

Als je terwijl je em laat lopen ook nog een groot programma start (bv Photoshop met veel grote plaatjes of een 3d spelletje spelen) dan zul je waarschijnlijk zien dat je eigen programmaatje ook al gebruikt geheugen 'loost'.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Verwijderd

Vjenne schreef op 16 augustus 2004 @ 12:55:
Is het dan niet mogelijk om dat meteen vanaf het begin te doen? Als ik het progje namelijk meteen aan het begin even minimaliseer en dan weer groter maak verbruikt hij al minder geheugen. Hij "weet" dan dus al wat hij allemaal weg kan gooien.
Ja dit kan, ik zal ff de betreffende API zoeken.
[edit]
Dit zijn de API's die je nodig hebt:
GetCurrentProcess
GetProcessWorkingSetSize
SetProcessWorkingSetSize

(Ik ken geen VB dus ff pseudo code)

1. GetCurrentProcess(myProcHandle)
2. GetProcessWorkingSetSize(myProcHandle, memNeededMin, memNeededMax)
3. SetProcessWorkingSetSize (myProcHandle, memNeededMin, memNeededMax).

bij 1 vraag je dus je huidige processhandle op,
bij 2 vraag je aanwindows het minimum en maximum benodigde geheugen
en bij 3 zet je keihard, hierdoor geeft windows alle losse niet direct benodigde gealloceerde geheugen vrij.

Werkt alleen op NT gebaseerde OS'en (dus Winnt4, Win2000, WinXp etc), ze zijn trouwens te vinden (voor de declaratie in kernel32.dll)


Houdt er wel mee dat zodra het programma dit geheugen nodig heeft,
dit eerst weer moet aanvragen aan het OS, dus je krijgt wel een performance
verslechtering. Maar ik denk niet dat je er iets van merkt bij jouw applicatie.

[ Voor 41% gewijzigd door Verwijderd op 16-08-2004 13:19 ]


  • Vjenne
  • Registratie: Oktober 2001
  • Laatst online: 04-05 00:03
Wohey idd, had net ff paar grote programma's draaien en toen kakte hij in naar ongeveer 2.2 mb, maar dan ook cker niet lager.

Kvind het eigenlijk sowieso nog steeds veel aangezien er andere programma's draaien van slechts enkele kb's. Maar opzich als je dus eigenlijk maar last houdt van 2.2 mb vind ik het al beter iig.

  • Vjenne
  • Registratie: Oktober 2001
  • Laatst online: 04-05 00:03
Woef, tering klinkt allemaal erg moeilijk, maar zal es ff wat documentatie over die functies op gaan zoeken idd. Heel erg bedankt, en zal het wel ff laten weten of het lukt.

Verwijderd

Vjenne schreef op 16 augustus 2004 @ 13:31:
[...]


Woef, tering klinkt allemaal erg moeilijk, maar zal es ff wat documentatie over die functies op gaan zoeken idd. Heel erg bedankt, en zal het wel ff laten weten of het lukt.
Let wel op dat je de output van stap 2 (min & max memory), gebruikt als input bij 3 !!!!!!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Vjenne schreef op 16 augustus 2004 @ 13:26:
Kvind het eigenlijk sowieso nog steeds veel aangezien er andere programma's draaien van slechts enkele kb's. Maar opzich als je dus eigenlijk maar last houdt van 2.2 mb vind ik het al beter iig.
Tja, VB sleept natuurlijk wel een behoorlijke runtime mee. Het is bij VB de prijs die je moet betalen voor de 'drag and drop easyness' ( zwaar overschat naar mijn idee magoed ).

Ik heb echter nog nooit een probleem gehad met een VB app die teveel geugen gebruikt oid. Is het bij jou wel echt een issue? Of is het gewoon een gevoelsmatige zaak / ergernis ? :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Vjenne
  • Registratie: Oktober 2001
  • Laatst online: 04-05 00:03
farlane schreef op 16 augustus 2004 @ 13:50:
[...]


Tja, VB sleept natuurlijk wel een behoorlijke runtime mee. Het is bij VB de prijs die je moet betalen voor de 'drag and drop easyness' ( zwaar overschat naar mijn idee magoed ).

Ik heb echter nog nooit een probleem gehad met een VB app die teveel geugen gebruikt oid. Is het bij jou wel echt een issue? Of is het gewoon een gevoelsmatige zaak / ergernis ? :)
Haha, jah naja die aantallen mb vind ik gewoon zonde van het geheugen. Maar met die codes van maui kom ik overigens geen stap verder. Ik krijg namelijk niet eens die functie 'GetCurrentProcess' aan de gang. Krijg er altijd -1 als waarde uit :( . Denk dat ik het maar beetje laat zo dan...

Verwijderd

Vjenne schreef op 16 augustus 2004 @ 14:15:
[...]


Haha, jah naja die aantallen mb vind ik gewoon zonde van het geheugen. Maar met die codes van maui kom ik overigens geen stap verder. Ik krijg namelijk niet eens die functie 'GetCurrentProcess' aan de gang. Krijg er altijd -1 als waarde uit :( . Denk dat ik het maar beetje laat zo dan...
Die -1 is juis prima.

MSDN:
A pseudo handle is a special constant, currently (HANDLE)-1, that is interpreted as the current process handle. For compatibility with future operating systems, it is best to call GetCurrentProcess instead of hard-coding this constant value. The calling process can use a pseudo handle to specify its own process whenever a process handle is required. Pseudo handles are not inherited by child processes.
Je zou dus in die andere functies gewooon keihard -1 kunnen gebruiken ipv MyProcessHandle, echter is het beter om even deze api aan te roepen, de waarde die je nu krijgt -1 is dus de correcte.

Verwijderd

Vjenne schreef op 16 augustus 2004 @ 14:15:
[...]


Haha, jah naja die aantallen mb vind ik gewoon zonde van het geheugen.
Het is natuurlijk pas "zonde van het geheugen" als het vol zit en je elke mb moet gaan wikken. Tot die tijd zit dat geheugen er tenslotte niet voor niks in: je hebt er toch voor betaald dus het zou zonde zijn om het niet te gebruiken :*).

Verwijderd

Vjenne schreef op 16 augustus 2004 @ 13:26:
Wohey idd, had net ff paar grote programma's draaien en toen kakte hij in naar ongeveer 2.2 mb, maar dan ook cker niet lager.

Kvind het eigenlijk sowieso nog steeds veel aangezien er andere programma's draaien van slechts enkele kb's. Maar opzich als je dus eigenlijk maar last houdt van 2.2 mb vind ik het al beter iig.
Dit kan de performance nadelig beinvloeden als je dat zelf probeert te regelen.
En bovendien geeft Taskmanager geen goed beeld van het geheugenbeheer.
Pagina: 1