c++ - beispiel - realloc




Multithread-Speicherzuordner für C/C++ (6)

Der Locklessinc-Allokator ist sehr gut und der Entwickler reagiert darauf, wenn Sie Fragen haben. Es gibt einen Artikel, den er über einige der verwendeten Optimierungstricks geschrieben hat. Es ist eine interessante Lektüre: http://locklessinc.com/articles/allocator_tricks/ . Ich habe es in der Vergangenheit mit hervorragenden Ergebnissen verwendet.

Ich habe derzeit stark Multi-Thread-Server-Anwendung, und ich bin für einen guten Multi-Threaded-Speicherzuordner einkaufen.

Bisher bin ich hin- und hergerissen zwischen:

  • Suns Umem
  • Googles tcmalloc
  • Intels Threading-Bausteinzuweiser
  • Emery Bergers Schatz

Von dem, was ich gefunden habe, könnte der Hort am schnellsten sein, aber ich hatte vorher noch nichts davon gehört, also bin ich skeptisch, ob es wirklich so gut ist, wie es scheint. Jeder hat persönliche Erfahrung, diese Zuordner auszuprobieren?


Ich habe tcmalloc benutzt und über Hoard gelesen. Beide haben ähnliche Implementierungen und beide erreichen eine ungefähr lineare Leistungsskalierung in Bezug auf die Anzahl der Threads / CPUs (gemäß den Graphen auf ihren jeweiligen Seiten).

Also: Wenn Leistung wirklich unglaublich wichtig ist, dann teste Leistung / Belastungstests. Ansonsten würfeln Sie einfach einen Würfel und wählen Sie einen der aufgelisteten (gewichtet nach Benutzerfreundlichkeit auf Ihrer Zielplattform).

Und von Trshivs Link aus sieht es so aus, als ob Hoard, tcmalloc und ptmalloc für die Geschwindigkeit ungefähr vergleichbar sind. Insgesamt sieht tt so aus, als wäre ptmalloc so optimiert, dass es so wenig Platz wie möglich einnimmt. Hoard ist für einen Kompromiss aus Geschwindigkeit und Speichernutzung optimiert und tcmalloc ist auf pure Geschwindigkeit optimiert.


Sie können versuchen, ltalloc (Allzweck-globalen Speicherzuordner mit der Geschwindigkeit des schnellen Pool-Allokators).


Vielleicht ist das der falsche Weg, um sich dem zu nähern, was Sie fragen, aber vielleicht könnte eine andere Taktik insgesamt eingesetzt werden. Wenn Sie nach einem wirklich schnellen Speicherzuordner suchen, sollten Sie vielleicht fragen, warum Sie all die Zeit damit verbringen müssen, Speicher zuzuordnen, wenn Sie vielleicht nur mit der Stapelzuweisung von Variablen davonkommen. Eine Stapelzuweisung, die viel ärgerlicher und richtiger ist, könnte Ihnen viele Mutex-Konflikte ersparen und seltsame Probleme mit der Speicherbeschädigung aus Ihrem Code heraushalten. Außerdem haben Sie möglicherweise weniger Fragmentierung, die helfen könnte.


Wir haben bei einem Projekt, bei dem ich vor ein paar Jahren gearbeitet habe, Hort genommen. Es schien großartig zu funktionieren. Ich habe keine Erfahrung mit den anderen Allokatoren. Es sollte ziemlich einfach sein, andere auszuprobieren und Lasttests durchzuführen, oder?


Die einzige Möglichkeit, wirklich zu erkennen, welcher Speicherzuordner für Ihre Anwendung geeignet ist, besteht darin, einige davon auszuprobieren. Alle erwähnten Allokatoren wurden von intelligenten Leuten geschrieben und werden die anderen auf einer bestimmten Mikrobenmark oder der anderen schlagen. Wenn all Ihre Anwendung den ganzen Tag lang malloc ist ein 8-Byte-Chunk in Thread A und frei in Thread B, und braucht nichts anderes zu behandeln, könnten Sie wahrscheinlich einen Speicherzuordner schreiben, der die Hosen aus irgendeinem schlägt die bisher aufgeführten. Für viel mehr wird es nicht sehr nützlich sein. :)

Ich habe einige Erfahrung mit Hoard, wo ich arbeite (genug, dass einer der obskureren Bugs, die in der letzten Version 3.8 angesprochen wurden, als Ergebnis dieser Erfahrung gefunden wurde). Es ist ein sehr guter Allokator - aber wie gut, für Sie, hängt von Ihrer Arbeitsbelastung ab. Und Sie müssen für Hoard bezahlen (obwohl es nicht zu teuer ist), um es in einem kommerziellen Projekt ohne GPL-Code zu verwenden.

Ein sehr leicht angepasster ptmalloc2 ist seit längerer Zeit der Allokator hinter dem malloc von glibc und daher unglaublich weit verbreitet und getestet. Wenn Stabilität vor allem wichtig ist, könnte es eine gute Wahl sein, aber Sie haben es in Ihrer Liste nicht erwähnt, also nehme ich an, es ist out. Für bestimmte Workloads ist es schrecklich - aber das gleiche gilt für alle mallocs für allgemeine Zwecke.

Wenn Sie bereit sind, dafür zu zahlen (und der Preis ist vernünftig, nach meiner Erfahrung), SmartHeap SMP ist auch eine gute Wahl. Die meisten anderen genannten Allokatoren sind als Drop-In malloc / free new / delete-Ersetzungen konzipiert, die LD_PRELOAD'd sein können. SmartHeap kann auch auf diese Art und Weise verwendet werden, aber es enthält auch eine gesamte Zuteilungs-API, mit der Sie Ihre Zuteiler auf den Inhalt Ihres Herzens abstimmen können. In Tests, die wir durchgeführt haben (wiederum sehr spezifisch für eine bestimmte Anwendung), war SmartHeap ungefähr dasselbe wie Hoard für Leistung, wenn es als Drop-In-Malloc-Ersatz fungiert; Der wahre Unterschied zwischen den beiden ist der Grad der Anpassung. Sie können eine bessere Leistung erzielen, je weniger allgemein Sie Ihren Zuweiser benötigen.

Abhängig von Ihrem Anwendungsfall ist ein Allzweck-Multithread-Allokator möglicherweise nicht das, was Sie überhaupt verwenden möchten. Wenn Sie ständig Objekte malloc und frei haben, die alle die gleiche Größe haben, möchten Sie vielleicht einfach einen einfachen Plattenverteiler schreiben. Die Slab-Zuweisung wird an mehreren Stellen im Linux-Kernel verwendet, die zu dieser Beschreibung passen. (Ich würde Ihnen ein paar nützlichere Links geben, aber ich bin ein "neuer Benutzer" und hat entschieden, dass neue Benutzer nicht in einer Antwort zu hilfreich sein können. Google kann jedoch gut genug aushelfen.)





allocation