2009-10-05 7 views
7

Während der letzten Tage habe ich einige Informationen über andere Speicherzuordner als den Standard malloc() gewonnen. Es gibt einige Implementierungen, die viel besser als malloc() für Anwendungen mit vielen Threads scheinen. Zum Beispiel scheint es, dass tcmalloc und ptmalloc bessere Leistung haben.Was ist die beste Lösung, um einen neuen Speicherzuordner in einem vorhandenen Code zu ersetzen?

Ich habe eine C++ - Anwendung, die beide malloc und new-Operatoren an vielen Orten verwendet. Ich dachte, sie durch etwas wie ptmalloc zu ersetzen, kann seine Leistung verbessern. Aber ich frage mich, wie funktioniert der Operator new, wenn in C++ - Anwendung, die unter Linux ausgeführt wird, verwendet? Verwendet es das Standardverhalten von malloc oder etwas anderes?

Was ist der beste Weg, um den new Speicherzuordner durch den alten im Code zu ersetzen? Gibt es eine Möglichkeit, das Verhalten zu überschreiben oder new und malloc oder muss ich alle Anrufe zu ihnen einzeln ersetzen?

+0

Haben Sie festgestellt, dass Ihr Programm eine beträchtliche Zeit für die Speicherverwaltung benötigt? – rpg

+0

Ja, das ist sicher. Ich habe das schon gemacht –

Antwort

2

Vom TCMalloc documentation:

Um TCmalloc zu verwenden, verknüpfen Sie nur tcmalloc in Ihre Anwendung über den "-ltcmalloc" Linker-Flag. Sie können tcmalloc in Anwendungen verwenden Sie nicht selbst kompilieren haben, von LD_PRELOAD mit:

$ LD_PRELOAD = "/ usr/lib/libtcmalloc.so"

ptmalloc scheint ähnlich zu sein (aber wenn Sie Unter Linux verwenden Sie es wahrscheinlich bereits because it's part of the GNU C library).

würde ich operator new erwarten malloc zu nennen, aber Sie können auf malloc, indem Sie einen Haltepunkt für sich leicht überprüfen, dann new aufrufen. Wenn Ihre newmalloc, you can redefine it so that it does nicht aufruft.

+1

Sie übersprungen den Teil, wo sie sagen: LD_PRELOAD ist schwierig, und wir empfehlen nicht unbedingt diese Art der Verwendung. – rpg

+0

Das stimmt, das habe ich getan - weil ich nicht mehr als das Wesentliche zitieren wollte. Die ausführliche Dokumentation befindet sich hinter dem Link. –

0

Ich denke, Überreiten ist definitiv möglich. Sie können Ihre Anwendung einfach mit der neuen Implementierungsbibliothek verknüpfen, die Sie möchten, und alle Aufrufe von new, malloc, werden überschrieben. Ich habe das nicht getan. Aber ich rate, dass es möglich ist, weil es, wenn es Valgrind verwendet, seine eigenen Speicherzuordner verwendet, um die Speicherauslastungsstatistiken einer Anwendung zu verfolgen und am Ende Ergebnisse zu erzeugen. Wenn es möglich ist, sollte es definitiv einen Weg geben.

Überprüfen Sie diese link. Es enthält Informationen über die ähnliche Smartheap-Bibliothek!

1

Wenn Ihr Programm multi-threaded ist, wird der Hoard Allokator hoch angesehen. Ich persönlich denke nicht, dass es sich auf Linux lohnt, da Glibcs ​​Ptmalloc schon ziemlich gut ist.

+0

Der Code, über den ich spreche, verwendet zu viele neue und malloc-Aufrufe. Wird Ptmalloc tatsächlich aufgerufen, wenn der Code für Linux kompiliert wird? –

+1

Ja, wenn Sie unter Linux arbeiten, verwenden Sie bereits ptmalloc. –

0

Wie viel Zeit hat Ihre App für die Speicherzuweisung?