2009-01-23 6 views
26

Ich habe mit Boost :: Pool ein paar Mal an Orten gespielt, wo es mir schien, dass ich ernsthaft den Haufen mit einer Menge Objekt "Churn" hämmerte. Im Allgemeinen habe ich boost::object_pool oder boost::pool_alloc als STL-Vorlagenparameter verwendet. Das Ergebnis ist jedoch unweigerlich, dass die Leistung praktisch unverändert oder wesentlich schlechter ist.Haben Sie jemals eine signifikante Beschleunigung mit boost :: pool erreicht?

Ich bin gespannt auf irgendwelche Erfolgsgeschichten damit zu hören.

Welche Art von Dingen sollte ich in der Profilausgabe suchen, die boost :: pool wahrscheinlich helfen könnte?

Ist es eigentlich ziemlich schwer, gute alte malloc zu verbessern?

Antwort

20

Speicherpools sind am effektivsten imo für Transaktions Stil Verarbeitung, wo Sie den Pool zuweisen und dann, wenn die Transaktion durchgeführt wird, lass es einfach in Vergessenheit geraten. Die tatsächliche Geschwindigkeit ist nicht, dass jede Zuweisung viel schneller sein wird, dass Sie fast keine Speicherfragmentierung in einer extrem lange laufenden Anwendung haben werden.

In Art, es klingt wie Sie Ihre Anwendungen garantieren nicht, Speicherpools

+0

Nun, dieser hat die Frage tatsächlich beantwortet (obwohl ich mich in diesem Fall sicherlich einer vorzeitigen Optimierung schuldig gemacht habe, wie in den anderen Antworten angemerkt). – timday

3

Möglicherweise möchten Sie zuerst Ihre Leistungsprobleme zu Speicherzuordnungen aufspüren, bevor Sie beginnen, dafür zu optimieren.

Beschränken Sie also Ihre Profilierung, um den Ort des Problems zu ermitteln. Dies kann eine Menge Aufrufe an denselben Code sein, der nicht lange dauern kann, wenn er nur einmal aufgerufen wird.

10

Blind Optimierungen sind nicht gut. Versuchen Sie, Google-Speicherzuordner zu verwenden, Sie müssen nicht einmal Ihre Anwendung neu kompilieren. Sie finden, was Sie hier wissen müssen:

http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html

Gaetano

+0

Danke für den Zeiger. Eines der Dinge, mit denen ich spielte, waren Thread-spezifische Speicherpools, aber tcmalloc sieht nach einer saubereren Methode aus, um sie zu bekommen. – timday

16

mit Ja, 500% Geschwindigkeitserhöhung. Die Anwendung (ziemlich dumm, aber manchmal muss man mit dem arbeiten, was man hat) kopierte Elemente von 1 std :: map zu einem anderen in einer Schleife (es gab einige Entscheidungsfindungen in der Schleife) und die resultierenden Zuordnungen auf Multithread-/Prozessservern führte zu Heap-Konkurrenz. Ich habe den Boost-Pool als Zuordner auf der zweiten Karte hinzugefügt und das Ergebnis war eine Steigerung der Ausführungsgeschwindigkeit der Anwendung um 500%.

Verwandte Themen