Speicherverbrauch der .exe laut Taskmanager

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
rafka
Beiträge: 7
Registriert: 15.11.2004 18:08

Speicherverbrauch der .exe laut Taskmanager

Beitrag 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
Rafka RS Sunday
Benutzeravatar
benny
Beiträge: 383
Registriert: 29.08.2004 09:18
Wohnort: Am Ende des www's
Kontaktdaten:

Beitrag 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/
So long,
benny!
.
nur t0te f1sche schw1mmen m1t dem str0m - 00100 !
Benutzeravatar
rafka
Beiträge: 7
Registriert: 15.11.2004 18:08

Beitrag 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
Rafka RS Sunday
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Mach ein Fenster auf und benutze ein paar standard-DLLs und schon hast du einen verdammt großen Speicherverbrauch...
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag 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!
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Benutzeravatar
rafka
Beiträge: 7
Registriert: 15.11.2004 18:08

Beitrag 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
Rafka RS Sunday
Benutzeravatar
AndyMars
Beiträge: 141
Registriert: 08.09.2004 11:59
Computerausstattung: Win11 Prof 64bit, i5-13500 @ 4.8 GHz, 32GB RAM, Nvidia RTX 4070 TI
Wohnort: Zürich, Schweiz
Kontaktdaten:

Beitrag 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:

Code: Alles auswählen

OpenConsole()
Input()
CloseConsole()
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 ;)...
Grüsse von AndyMars
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
AndyMars
Beiträge: 141
Registriert: 08.09.2004 11:59
Computerausstattung: Win11 Prof 64bit, i5-13500 @ 4.8 GHz, 32GB RAM, Nvidia RTX 4070 TI
Wohnort: Zürich, Schweiz
Kontaktdaten:

Beitrag 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?
Grüsse von AndyMars
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten