PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : boost::pool und C-Memory Chunks


mekakic
2013-03-28, 10:32:18
Ich verwende mittlerweile boost:pool um ein Job Objekt zu erzeugen, das extrem oft auf dem Heap konstruiert werden muß... in bestimmten Lastsituationen hat der Profiler im fraglichen Thread fast nur noch Zeit im new Operator verbracht. Das Pooling hat sich deutlich bemerktbar gemacht (aktuell Faktor 3.3 im Paketdurchsatz) an einem Nadelöhr; eine Art zentraler Job Dispatcher.

Diese Job Objekte haben allerdings häufig auch eine C-Array Payload, die ich auch gerne aus einem Memory Pool konstruieren möchte und an der Stelle komme ich nicht weiter. Erst nach der Konstruktion steht fest ob sich eine Payload haben und wie groß diese sein wird. Momentan ist das ein zweiter Call um sich klassisch ein C-Array vom Heap zu holen.

Bekomme ich diesen Call auch irgendwie auf den Boost Memory Pool abgebildet? Ich finde nur Tutorials, die die klassische object Erzeugung beschreiben und aus der boost doku werde ich in dem Punkt nicht schlau.

Durch die dynamischen Speichergrößen sich es etwas ungünstig für einen object_pool. Allerdings ist abhängig von der Runtime Konfiguration der Speicherverbrauch relativ statisch. Also aus einem 200MiB Pool könnte man relativ stabil den Speicherverbrauch für Konfiguration A bedienen, bei Konfiguration B reichen dafür auch schon 30MiB. Aber es leak'd sich im Betrieb nicht hoch... das einzige wären durch die dynamischen Größen möglicherweise Fragmentierungseffekte. Dazu habe ich überlegt die Payload evtl. immer auf n^2 Byte Blöcke aufzurunden und ggf irgendein Templategelumpe zu bauen um für jede Blockgröße einen eigenen Pool vorzuhalten.

Aber das ist Spekulation weil ich es nicht genau weiß, was hier am meisten Sinn macht. Gibt es da bei boost::pool irgendeine Unterstützung für dieses Szenario, um einfach C-Arrays (dynamischer Größe) zu erzeugen und keine Objekte? Muß man sich da selber drum kümmern auf die Blockgrößen achtzugeben und hat boost::pool da entsprechende Mechanismen?

Danke :)