Reduzierung des Speicherbedarfs großer unbekannter Codebasen


4

Angenommen, Sie haben eine ziemlich große (~ 2,2 MLOC), ziemlich alte (vor mehr als 10 Jahren gestartete) Windows-Desktop-Anwendung in C/C++. Etwa 10% der Module sind extern und haben keine Quellen, nur Debug-Symbole.

Wie würden Sie den Speicherbedarf der Anwendung halbieren? Was würden Sie zumindest tun, um herauszufinden, wo Speicher verbraucht wird?

0

Ich glaube nicht, dass Ihre Frage gut gestellt ist.

Die Größe des Quellcodes steht nicht in direktem Zusammenhang mit dem Speicherbedarf. Sicher, der kompilierte Code wird etwas Speicher belegen, aber die Anwendung wird möglicherweise eigene Speicheranforderungen haben. Sowohl statisch (die im Code deklarierten Variablen) als auch dynamisch (das Objekt, das die Anwendung erstellt).

Ich würde vorschlagen, Sie Programmausführung zu profilieren und den Code sorgfältig zu studieren.

  0

Größe des Quellcodes Hinweise auf die Gesamtkomplexität des Projekts. Wie viel Zeit braucht es, um 400 KLOC "sorgfältig zu studieren"? :) 23 sep. 082008-09-23 19:01:56

  0

sollte es einfach sein. 400k ist nicht, was ich groß nennen würde :) wie Sie nur Heap-Zuordnungen überprüfen müssen, finden Sie alle malloc und neue Anrufe, und Sie sind fast da. 23 sep. 082008-09-23 19:06:57

  0

gbjbaanb, ich wünschte, ich könnte Ihnen zeigen, * nur * Modul Abhängigkeitsdiagramm :) und in Bezug auf "finden Sie alle die Malloc und neu", gibt es auch mindestens SysAllocString (oft in CComBSTRs begraben) 23 sep. 082008-09-23 19:45:05


2

Es ist keine leichte Aufgabe. Beginnen Sie mit der Suche nach Speicherlecks, die Sie finden können (ein gutes Tool wäre Rational Purify). Überfliegen Sie den Quellcode und versuchen Sie, Datenstrukturen und/oder Algorithmen zu optimieren.
Es tut uns leid, wenn dies pessimistisch klingt, aber die Speicherauslastung um 50% zu verringern klingt nicht realistisch.


7

Überschreiben Sie malloc()/free() und new()/delete() mit Wrappern, die verfolgen, wie groß die Zuweisungen sind und (durch Aufzeichnen des Callstacks und späteres Auflösen gegen die Symboltabelle) von. Lassen Sie bei der Abschaltung Ihren Speicher anzeigen, der noch belegt ist.

Dies sollte Ihnen beide ermöglichen, herauszufinden, wo die größten Zuweisungen sind und alle Lecks zu fangen.

  0

Können Sie auf dem besten Weg, um Zuteilung Funktionen überschreiben anwendungsweit, vorzugsweise mit begrenzten Quellcodeänderungen? Außerdem gibt es eine Menge von COM/BSTR-Verarbeitung; Ich glaube, dass ihre Zuweiser nicht von der Analyse ausgeschlossen werden können. 23 sep. 082008-09-23 19:39:20


3

this is description/skeleton von Speicher-Tracing-Anwendung Ich verwendet, um Speicherverbrauch unseres Spiels um 20% zu reduzieren. Es hat mir geholfen, viele Zuordnungen von externen Modulen zu verfolgen.

  0

Noch nie von Debug Interface Access zuvor gehört - upvoted. 23 sep. 082008-09-23 20:33:56


0

Erste Plätze zu starten wäre für mich:

Hat die Anwendung viel Vorbelegung Speicher tun später verwendet werden? Sitzt diese Erinnerung oft ungenutzt, niemals ausgegeben? Erwägen Sie, nach Bedarf zu newing/deleting (oder besser ein smart_ptr) zu wechseln.

Nutzt der Code ein statisches Array wie

Object arrayOfObjs[MAX_THAT_WILL_EVER_BE_USED]; 

und objs in diesem Array auszuteilen? Wenn dies der Fall ist, sollten Sie diesen Speicher manuell verwalten.


1

Es besteht die Möglichkeit, dass Sie einige signifikante Ineffizienzen sehr schnell feststellen können. Zuerst sollten Sie überprüfen, wofür der Speicher verwendet wird. Ein Werkzeug, das ich dafür sehr nützlich gefunden habe, ist Memory Validator

Sobald Sie diese "Speicherverbrauch Karte" haben, können Sie nach Low Hanging Fruit suchen. Gibt es Datenstrukturen, die viel Speicher verbrauchen und in einer kompakteren Form dargestellt werden könnten? Dies ist oft möglich, insb. Wenn der Datenzugriff gut gekapselt ist und Sie über eine zusätzliche CPU-Leistung verfügen, können Sie diese bei jedem Zugriff komprimieren/dekomprimieren.

  0

Es hängt davon ab, ob er bedeutet "vor 10 Jahren erschaffen, unverändert seit" oder "in den letzten 10 Jahren organisch gewachsen und angesammelt hat". Die zweite Kategorie von Apps kann definitiv Speicherfresser sein. 23 sep. 082008-09-23 19:08:28

  0

Es ist gewachsen. Und ansammeln. Die Anforderung, den Ressourcenverbrauch zu reduzieren, wird wie immer von oben weitergegeben. 23 sep. 082008-09-23 19:31:54


0

Eines der Tools zur Analyse der Speicherauslastung ist LeakDiag, verfügbar für free download from Microsoft. Es erlaubt anscheinend, alle Benutzer-Modus-Zuordner auf VirtualAlloc herunterzufahren und Prozesszuweisungs-Snapshots jederzeit in XML abzulegen.Diese Snapshots können dann verwendet werden, um zu bestimmen, welche Aufruf-Stacks den meisten Speicher zuordnen und welche Aufruf-Stacks undicht sind. Es fehlt ein hübsches Frontend für die Snapshot-Analyse (es sei denn, Sie können LDParser/LDGrapher über Microsoft Premier Support beziehen), aber alle Daten sind vorhanden.

Eine weitere Sache zu beachten ist, dass Sie aufgrund Caching falsche Leck Positiven von BSTR allocator haben, sehen "Hey, why am I leaking all my BSTR's?"