it-swarm.com.de

Profilierung der Speicherzuordnung in C++

Ich schreibe eine Anwendung und bin überrascht, dass der gesamte Speicherbedarf bereits zu hoch ist. Ich möchte ein Profil der dynamischen Speichernutzung meiner Anwendung erstellen: Wie viele Objekte jeder Art befinden sich im Heap und welche Funktionen haben diese Objekte erstellt? Wie viel Speicher wird von jedem Objekt verwendet?

Gibt es eine einfache Möglichkeit, dies zu tun? Ich arbeite sowohl an Linux als auch an Fenstern, so dass Werkzeuge jeder Plattform ausreichen würden. 

HINWEIS: Hier geht es nicht um Speicherlecks.

38
amit

Haben Sie versucht, Valgrind ? Es ist ein Tool zur Profilerstellung für Linux. Es hat eine Speicherprüfung (für Speicherlecks und andere Speicherprobleme) namens Memcheck, aber auch einen Heap-Profiler namens Massif. 

14
javier-sanz

Für einfache Statistiken können Sie einfach eine Vorlage wie diese hinzufügen, um herauszufinden, wo der gesamte Speicher verwendet wird.

template<class T>
class Stats {
  static int instance_count;
public:
  Stats() {
    instance_count++;
  }
  ~Stats() {
    instance_count--;
  }
  static void print() {
    std::cout << instance_count << " instances of " << typeid(T).name() <<
        ", " << sizeof(T) << " bytes each." << std::endl;
  }
};

template<class T>
int Stats<T>::instance_count = 0;

Dann können Sie diese als Basisklasse zu den Klassen hinzufügen, von denen Sie vermuten, dass sie viele Instanzen haben, und Statistiken der aktuellen Speichernutzung ausdrucken:

class A : Stats<A> {
};

void print_stats() {
  Stats<A>::print();
  Stats<B>::print();
  ...
}

Dies zeigt nicht an, in welchen Funktionen die Objekte zugewiesen wurden, und gibt nicht zu viele Details an, aber es reicht aus, um herauszufinden, wo Speicherplatz verbraucht wird.

9
sth

Bei Windows überprüfen Sie die Funktionen in "crtdbg.h". crtdbg.h enthält die Debug-Version der Speicherzuordnungsfunktionen. Es enthält auch Funktionen zum Erkennen von Speicherverlusten, Verfälschungen, zum Überprüfen der Gültigkeit von Heap-Zeigern usw. 

Ich denke, dass folgende Funktionen für Sie nützlich sein werden.

_CrtMemDumpStatistics _ CrtMemDumpAllObjectsSince

Der folgenden MSDN-Link listet die Heap-Statusberichtsfunktionen und den Beispielcode http://msdn.Microsoft.com/en-us/library/wc28wkas(VS.80).aspx

8
Nitin Bhide

Sie können den Memory Validator unter http://www.softwareverify.com/cpp/memory/index.html ausprobieren.

Es ist eines der besten Werkzeuge, mit denen ich die Speicherbelegung profiliert habe. Die 30-Tage-Testversion steht zum kostenlosen Download zur Verfügung.

5
Canopus

MTuner - ein freier C/C++ - Speicherprofiler. Beschreibung unten:

MTuner ist ein Multi-Plattform-Speicherprofilierungs-, Leckerkennungs- und Analyse-Tool, das MSVC-, GCC- und Clang-Compiler unterstützt. Zu den Features gehören: Timeline-basierter Verlauf der Speicheraktivität, leistungsstarke Filterung, SDK für die manuelle Instrumentierung mit vollständigem Quellcode, kontinuierliche Integration durch Befehlszeilenverwendung, Erkennung von Speicherlecks und vieles mehr. Erstellen Sie mit GCC- oder Clang-Cross-Compilern ein Profil für beliebige Software-Targeting-Plattformen. Mit integrierter Unterstützung für Windows-, PlayStation 4- und PlayStation 3-Plattformen sowie einer Plattform, auf die ein Windows-basierter Cross-Compiler zielt.

3
mtosic

Es gibt verschiedene Möglichkeiten, die Sie tun können. Am einfachsten ist es, eine Debug Malloc-Bibliothek zu verlinken. Es gibt eine Anzahl von ihnen, abhängig von den Details Ihrer Umgebung (z. B. google für _malloc_dbg für Windows).

Die zweite Wahl ist, dass Sie new und delete in C++ überladen können. Es ist möglich, die grundlegenden Neuerungen zu überladen und mit neuen Funktionen zu löschen, die die Speicherzuordnung und -nutzung nachverfolgen.

3
Charlie Martin

Ich habe gerade einen Win32-Speicherprofiler MemPro als kostenlose Beta-Version veröffentlicht. http://www.puredevsoftware.com/MemPro.htm . Es hakt sich in new/delete ein und sendet Daten an eine externe App, in der Sie die Zuordnungen auf verschiedene Arten anzeigen können. Hoffe, das ist hilfreich.

2
Stewart Lynch

Kapitel 1.10 aus Game Programming Gems Volume 2 ( Amazon link ) beschreibt einen einfachen, aber effektiven Drop-in-Debug-Memory-Manager von Peter Dalton, der eine anständige Statistik liefert, wenn Sie das Protokoll sichern.

1
Michael Burr

Kapitel 4.6 aus Game Programming Gems Volume 8 (Link zum Vorschaufenster für Safari-Bücher) beschreibt einen erweiterten Speicher-Profiler von Ricky Lung, der die Zuweisungsstatistik auf hierarchische Aufrufstapel-Weise anzeigen kann und dennoch Multithreading unterstützt.

1
Ricky Lung

In einem früheren Job haben wir ein Werkzeug namens "Purify" verwendet. Es ist ein Produkt von Rational/IBM. Ich denke nicht, dass dies ein kostenloses Tool ist, aber ich erinnere mich, dass es ziemlich gut war. Hier einige Infos:

http://en.wikipedia.org/wiki/IBM_Rational_Purify

1
Andy White

Ich habe auf AQtime site gesehen, dass sie eine gute Unterstützung für "Allocation Profiling" haben. 

0
amit

Probiere die gperftools - es kann:

  • profilspezifische Teile des Codes oder das gesamte Programm auf einmal erstellen.
  • daten über visuell gerichtete Graphen darstellen, die genaue Funktionsaufrufe und ihre Vererbung zeigen.
  • konzentrieren Sie sich auf bestimmte Codebereiche in einem visuellen Diagramm.
  • unterschiede zwischen Dumps anzeigen.
  • zugewiesenen Speicherplatz anzeigen statt verwendet - alles wird mit demselben Speicherauszug ausgeführt.

Es hat auch fast keinen Einfluss auf die Programmeffizienz.

0
abyss.7