Programmgröße verringern



  • Hi,

    ich habe ein simples Programm in ASM geschrieben, welches beim Herunterfahren WLAN deaktiviert.
    Die Binary ist 5,5kb groß, im Speicher benötigt sie 2,1 MB!
    Ich würde gerne an der Zahl drehen, weis aber nicht so recht, wie ich das anstellen kann.
    Was verursacht derart verschwenderische Speicherauslastungen?

    include \masm32\include\windows.inc
    include \masm32\include\wsock32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    include \masm32\include\comdlg32.inc 
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\wsock32.lib
    includelib \masm32\lib\comdlg32.lib 
    include    \masm32\include\SHELL32.INC
    includelib    \masm32\lib\SHELL32.LIB
    include    \masm32\include\ADVAPI32.INC
    includelib    \masm32\lib\ADVAPI32.lib
    

    Liegt es daran, dass durch die vielen Includes zur Laufzeit alle DLLs geladen werden, obwohl sie unnötig sind?

    Ich könnte dann näömlich hergehen und alle DLLs dynamisch laden zu dem Zeitpunkt, zu dem ich sie brauche.
    Dann brauch ich nur die Library, die die Funktion enthält zum Laden von DLLs.



  • Biehler schrieb:

    Die Binary ist 5,5kb groß, im Speicher benötigt sie 2,1 MB!

    Woher hast du den Wert?
    Wie groß ist der Stack?

    Die DLLs sind sowieso schon geladen, ich denke nicht dass die den Speicherbedarf großartig hochtreiben. 2,1 MB sind absolut gesehen auch nicht wirklich viel. Wenn ich von meinem Rechner ausgehe, sind das gerade mal ca. 0,05% des physikalischen Speichers - da passt dein Programm 2000 mal rein 🙂



  • Biehler schrieb:

    Liegt es daran, dass durch die vielen Includes zur Laufzeit alle DLLs geladen werden, obwohl sie unnötig sind?

    ja

    Biehler schrieb:

    Dann brauch ich nur die Library, die die Funktion enthält zum Laden von DLLs.

    die ist in jedem win32 prozess ohnehin mandatorisch.



  • Ja, es sind die DLLs die so viel Speicher brauchen. Die DLLs dynamisch zu laden würde aber vermutlich nichts bringen, da der Linker unnötige Referenzen normalerweise wegwirft. Wenn er kann, was er in deinem Fall wohl wird.
    Du kannst ja einfach mal mittels DependencyWalker gucken welche DLLs geladen werden.

    Davon abgesehen würde ich mir keinen Kopf machen. 2MB sind nichts, und vermutlich braucht dein Programm garnichtmal 2MB.



  • Gibt es da neben der puren Behauptung auch eine Begründung, warum die sowieso schon geladenen System-DLLs für den Speicherverbrauch verantwortlich sein sollen? Meines Erachtens wird der Speicher nicht zusätzlich belegt, sondern die DLLs werden in den virtuellen Speicherbereich des Prozesses eingeblendet, der sich entsprechend vergrößert.



  • der OP redet von virtuellem speicher.



  • Strandkanzler schrieb:

    der OP redet von virtuellem speicher.

    Nein, tut er nicht. Er redet von Speicherauslastung und Speicherbedarf.



  • Registrierter Troll schrieb:

    Gibt es da neben der puren Behauptung auch eine Begründung, warum die sowieso schon geladenen System-DLLs für den Speicherverbrauch verantwortlich sein sollen? Meines Erachtens wird der Speicher nicht zusätzlich belegt, sondern die DLLs werden in den virtuellen Speicherbereich des Prozesses eingeblendet, der sich entsprechend vergrößert.

    Es gibt so viele verschiedene "Speicher-Zahlen"...
    Ich vermute er hat einfach die erstbeste hergenommen, die ihm im Task-Manager über den Weg gelaufen ist.

    Davon abgesehen: einige System-DLLs legen einen per-process-state an (oder sogar per-thread). Der scheint dann sogar in den "private bytes" auf.



  • hustbaer schrieb:

    Ich vermute er hat einfach die erstbeste hergenommen, die ihm im Task-Manager über den Weg gelaufen ist.

    Möglicherweise. Deshalb auch meine Frage woher er den Wert hat.

    hustbaer schrieb:

    Davon abgesehen: einige System-DLLs legen einen per-process-state an (oder sogar per-thread).

    Ich halte es für mindestens ebenso wahrscheinlich, dass im PE-Header seiner .exe ein "Stack reserve"-Wert von 0x200000 steht, also der Standard-Wert IIRC.



  • Die Stack-Reserve Grösse scheint im "erstbesten Wert vom Taskmanager" garnicht auf 😉
    (Die Stack-Commit Grösse schon)
    Und Default ist 1MB, also 0x100000.

    Dafür beinhalten diverse Task-Manager Werte AFAIK auch Speicherbereiche die garnicht "private" sind, sondern "shared". D.h. man kann diese Werte auch nicht einfach aufsummieren. Und das wiederum heisst: es ist vollkommen egal ob dort 2MB oder 10MB steht, solange es grösstenteils "shared" Bereiche sind.

    Genaueres sollte sich aber halbwegs einfach ergoogeln lassen.


Anmelden zum Antworten