Seite 1 von 3
Speicherverbrauch der .exe laut Taskmanager
Verfasst: 15.11.2004 18:13
von rafka
Guten Tag,
leider habe ich zu dieser Frage noch keine befriedigende Antwort im Forum gefunden:
Wieso belegt eine mit purabasic erstellte .exe zur Laufzeit im RAM mehrere MB (laut Taskmanager), selbst wenn das Programm nur aus einer Codezeile besteht?
Das kann doch nicht der Sinn der Sache sein, wenn man kleine Programme schreibt, die dann doch denhalben RAM belegen. Hat jemand eine Idee?
Gruß Rafka
Verfasst: 15.11.2004 18:22
von benny
@rafka:
Folgenden Thread kannste im Archiv (vorheriger Version vom PureBoard)
finden:
http://robsite.de/php/pureboard-archiv/ ... rverbrauch
Da dies Dein erster Beitrag ist, hier nochmal der Link zum Forum-Archiv:
http://robsite.de/php/pureboard-archiv/
Verfasst: 15.11.2004 19:13
von rafka
Vielen Dank für den Link, befriedigend ist die dortige Antwort aber auch nicht. Es gibt doch in meinem Taskmanager auch deutlich kleinere Programme, also Tasks, die weniger RAM in Beschlag nehmen als mein Mini-Programm. Irgendwovon muss die Größe eines Programms im RAM ja abhängen (Ich benutze schließlich nur eine Anweisung und keine Datenstrukturen).
Danke Rafka
Verfasst: 15.11.2004 19:58
von GPI
Mach ein Fenster auf und benutze ein paar standard-DLLs und schon hast du einen verdammt großen Speicherverbrauch...
Verfasst: 15.11.2004 22:12
von PBZecke
rafka hat geschrieben: ...Ich benutze schließlich nur eine Anweisung und keine Datenstrukturen).
Danke Rafka
Ich weiß zwar nicht was für eine Anweisung das ist, aber die Anweisung steht sicher in einer Lib, die dann komplett geladen werden muss, zur Ausführung der Anweisung werden dann vielleicht noch andere Funktionen gebraucht, die dann wiederum noch andere Funktionen benötigen, und Schwupps sind schnell 2 MB weg!
Verfasst: 15.11.2004 22:43
von rafka
Na so ein einfachen MessageRequest zum Testen.
Vielleicht sollte ich mal eine exe erstellen, die gar nichts macht. Kann doch wirklich nicht wahr sein. Ich denke, purebasic ist so extrem von Hand optimiert usw. Ich freue mich über weitere Antworten.
rafka
Verfasst: 16.11.2004 01:15
von AndyMars
Das hat nichts mit PB zu tun. Das ist Windows - PB erledigt jede Menge für Dich (sei froh darum

), ohne dass Du es merkst - dazu gehört es auch, gewisse Dinge in Windows zu initialisieren - und die brauchen Speicher... das ist bei anderen Programmier-Sprachen auch nicht anders...
Nur so ein Bespiel:
Das macht jetzt ja wirklich gar nix - und trotzdem - schaut man sich das in einem modulviewer an, sieht man, dass da zusätzlich noch folgende DLLs aufgerufen werden:
CRTDLL.DLL
GDI32.DLL
KERNEL32.DLL
NTDLL.DLL
USER32.DLL
Du siehst - es passiert doch einiges...
Um das zu "optimieren", müsste man diese initialen Dinge deaktivieren können (und selber erledigen...). Ich weiss nicht, ob das mit PB möglich wäre.
Ich jedenfalls bin glücklich, das mir PB hier Arbeit abnimmt...
Interessant: Beobachte den Speicher von dem Progrämmchen (der code oben) und minimiere jetzt mal das Fenster - der Speicherverbrauch ändert sich von 800 kB auf ca. 50 kB in minimiertem Zustand und wenn Du es wieder auf normale Grösse bringst auf ca. 110 kB (zumindest bei meinem PC). Man kann ahnen, wofür der Speicher gebraucht wird.
Das könnte übrigens ein Trick sein ¦).
Das würde mich jetzt auch noch interessieren, wenn jemand zu erklären wüsste, wieso sich das so verhält. Und macht es Sinn die eigene Applikation zu minimieren (und ggfs. gleich wieder zu normalisieren), um den Speicher zu "sparen"?
PS: Wenn bei Dir ein so kleines Prog "denhalben" Speicher belegt, hast Du aber wirklich eine gaaaanz alte Maschine
...
Verfasst: 16.11.2004 16:58
von NicTheQuick
Das folgende Programmm, das meinen PC zu einer bestimmten Zeit herunterfährt verbraucht bei mir 948 kB unter Win2k. Wieviel sind es bei dir?
Code: Alles auswählen
Procedure Shutdown()
#EWX_LOGOFF = 0
#EWX_SHUTDOWN = 1
#EWX_REBOOT = 2
#EWX_FORCE = 4
#EWX_POWEROFF = 8
#TOKEN_ADJUST_PRIVILEGES = 32
#TOKEN_QUERY = 8
#SE_PRIVILEGE_ENABLED = 2
#ANYSIZE_ARRAY = 1
#VER_PLATFORM_WIN32_NT = 2
;#SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Structure MyLUID
LowPart.l
HighPart.l
Attributes.l
EndStructure
Structure MyTOKEN
PrivilegeCount.l
LowPart.l
HighPart.l
Attributes.l
EndStructure
Global hdlProcessHandle.l
Global hdlTokenHandle.l
Global tmpLuid.MyLUID
Global tkp.MyTOKEN
Global tkpNewButIgnored.MyTOKEN
Global lBufferNeeded.l
hdlProcessHandle = GetCurrentProcess_()
OpenProcessToken_(hdlProcessHandle, #TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY, @hdlTokenHandle)
; Get the LUID for shutdown privilege
SysName.s = "" + Chr(0)
Name.s = "SeShutdownPrivilege" + Chr(0)
Erg.l = LookupPrivilegeValue_(SysName, Name, @tmpLuid)
tmpLuid\Attributes = #SE_PRIVILEGE_ENABLED
tkp\PrivilegeCount = 1
tkp\LowPart = tmpLuid\LowPart
tkp\HighPart = tmpLuid\HighPart
tkp\Attributes = tmpLuid\Attributes
; Enable the shutdown privilege in the access token of this process
Erg.l = AdjustTokenPrivileges_(hdlTokenHandle, 0, @tkp, SizeOf(MyTOKEN), @tkpNewButIgnored, @lblBufferNeeded)
Erg.l = ExitWindowsEx_((#EWX_POWEROFF | #EWX_FORCE), 0)
EndProcedure
hour.l = 10
minute.l = 00
Repeat
time.l = Date()
If Hour(time) = hour And Minute(time) = minute
Shutdown()
Break
ElseIf Hour(time) = hour And Minute(time) > minute
MessageRequester("ShutDownSystemByGivenTime", "Programm vorzeitig beendet")
Break
EndIf
Delay(1000)
ForEver
Du kannst das Programm übrigens nur über den TaskManager beenden.
Verfasst: 16.11.2004 17:19
von AndyMars
Bei mir braucht das Programm ca. 940 kB... (auch Win 2k) Jetzt kannst Du mal vor der Endlos-Schleife folgenden code einfügen:
Code: Alles auswählen
OpenWindow(0,10,10,100,100,#PB_Window_SystemMenu,"ShutDown")
ShowWindow_(WindowID(),#SW_MINIMIZE) ;...das spart Speicher?
;HideWindow(0,1)
;CloseWindow(0)
Wenn die beiden unteren Befehle auskommentiert sind, braucht das Programm nur noch 160 kB... Wenn man einen der Befehle unten aktiviert, braucht es dann wieder etwas mehr - ist doch interessant, nicht?
Verfasst: 16.11.2004 18:46
von Kaeru Gaman
ist doch irgendwie klar... er muss sich ja daten zum window merken.. damit kann er doch nich die grafikkarte zunageln... ginge doch garnicht, dann müsste ja jeder 512MB-1GB grafikspeicher haben...