5 Stimmen

Kann ich den Speicherverbrauch von "privaten Bytes" dieses kleinen MSVC++ Projekts weiter reduzieren?

Ich frage das aus Neugierde und nicht aus echtem Bedarf, aber kann der Speicherverbrauch dieses winzigen MSVC++-Programms weiter reduziert werden? Quellcodedatei auf BitBucket.

Das Programm wurde mit "Optimierung für Dateigröße" kompiliert. Es erstellt ein nachrichtenloses Fenster und setzt einen Tastatur-Hook, um ein Symbol im Infobereich in Reaktion auf die Betätigung der Feststelltaste/Num Lock/Rollen-Taste anzuzeigen.

Laut VMMap werden die privaten Bytes wie folgt zugeordnet:

260 KB: Image
252 KB: Heap
240 KB: Seitentabelle
 24 KB: Stapel
 24 KB: Private Daten
------
800 KB  GESAMT

Bild

Die Anwendung selbst verwendet nur 20 KB davon; der Rest wird von einem Dutzend DLLs verbraucht. Es scheint, als ob das so klein wie möglich ist.

Heap

Das Programm reserviert nur etwa 3 KB an Daten im Heap: genau drei Instanzen einer bestimmten Klasse. Der Rest muss aus der CRT und/oder dem Standard-OS-Code stammen.

Kann dies vielleicht reduziert werden? Dies scheint ein Hauptkandidat für Einsparungen zu sein.

Seitentabelle

Die gesamte virtuelle Größe dieses Programms beträgt 44 MB, was etwa 11k Seiten entspricht. Das sind im Durchschnitt 22 Bytes pro Seite (obwohl vermutlich eine Menge Einträge ungenutzt freigehalten werden). Also kann dies wahrscheinlich nicht weiter reduziert werden. Oder etwa doch?

Stapel und Private Daten

Nun, die sind bereits extrem klein... obwohl ich mich frage, warum sie nicht noch kleiner sind. Das Programm verfügt meiner Meinung nach nicht annähernd über so viele private Daten oder Stapel.

Können Sie Vorschläge machen, um eine dieser Abschnitte kleiner zu machen als sie bereits sind?


Weitere Erkenntnisse:

  • Ein leeres Programm ohne CRT verwendet etwa 204 KB
  • Der Aufruf von CreateWindow fügt 420 KB hinzu
  • Der Aufruf zur Setzung des Tastatur-Hooks fügt 156 KB hinzu
  • Das Vermeiden der CRT-Nutzung spart 20 KB ein
  • Die gesamte virtuelle Größe erhöht sich auf ähnliche Weise
  • Die Nichtverwendung der CRT spart eine beträchtliche Menge an EXE-Größe ein: von 54 KB auf 18 KB, von denen 12 Ressourcen sind.

Es scheint also, als ob der Großteil dieses Speichers von der Windows API verbraucht wird, was bedeutet, dass keine signifikanten weiteren Reduzierungen möglich sind, es sei denn, man findet einen Weg, den Hook / Infobereichssymbole zum Funktionieren zu bringen, ohne ein Fenster zu erstellen (dieses Programm ignoriert sowieso alle Nachrichten).

3voto

Adrian McCarthy Punkte 42872

Es ist möglich, die C-Laufzeitbibliothek vollständig zu umgehen, indem man sich auf die von dem Betriebssystem bereitgestellten APIs verlässt (die sich in DLLs befinden, die bereits in Ihren Prozess eingebunden sind) oder sie selbst implementiert.

Normalerweise lohnt es sich nicht, es sei denn, Sie machen bereits einen minimalen Gebrauch von der Sprachlaufzeitbibliothek. Es macht Ihre Anwendung auch noch weniger portabel.

2voto

Ben Voigt Punkte 268424

Der "Process Environment Block" enthält eine Kopie aller Umgebungsvariablen.

Wenn du keine Umgebung vererbst (d.h. der übergeordnete Prozess hat dich mit einer sauberen Umgebung gestartet), könnte das zu einem spürbaren Rückgang im Vergleich zur Gesamtspeicherauslastung führen, die du gerade betrachtest.

1voto

MSN Punkte 51308

Aus dieser Antwort ist zu entnehmen, dass private Bytes ein Maß für Speicher ist, der entweder explizit reserviert oder als MEM_PRIVATE markiert ist oder für ausführbare Seiten, die beschrieben wurden. Wenn Sie also Speicher dynamisch zuweisen anstelle von globalen Variablen zu verwenden (einschließlich statischer lokaler Funktionen), sollten Sie in der Lage sein, Ihren privaten Bytes-Verbrauch zu reduzieren, obwohl Sie möglicherweise Ihren gesamten Heap-Verbrauch erhöhen.

0voto

Renan Greinert Punkte 3228

Sie können "pragma pack(1)" verwenden, um sicherzustellen, dass kein zusätzlicher Platz zwischen dem Speicherplatz der Elemente bereitgestellt wird.

http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X